entity framework — n-tier — многие ко многим — как получить список «где»

#c# #entity-framework #many-to-many #n-tier-architecture #navigation-properties

#c# #entity-framework #многие ко многим #n-tier-архитектура #навигация-свойства

Вопрос:

класс «многие ко многим»

введите описание изображения здесь

в базе данных моя таблица

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Я использую EF6 и N-Tier и реализую общий уровень доступа к данным из этого поста

Я хочу дать урок в группе, я использую этот метод для получения списка в DAL

     public virtual IList<T> GetList(Func<T, bool> where, params Expression<Func<T, object>>[] navigationProperties)
    {
        List<T> list;
        using (var context = new AzmaEntities())
        {
            IQueryable<T> dbQuery = context.Set<T>();
            foreach (Expression<Func<T, object>> navigationProperty in navigationProperties)
                dbQuery = dbQuery.Include<T, object>(navigationProperty);
            list = dbQuery
                .AsNoTracking()
                .Where(where)
                .ToList<T>();
        }
        return list;
    }
  

и на бизнес-уровне :

     public IList<Lesson> GetLessonWhereGrpId(int grpId)
    {
        Group grp = new Group();
        GroupBLL grpbll = new GroupBLL();
        grp = grpbll.GetGroupById(grpId);

        return _LessonRepository.GetList(
            d => d.Group.Equals(grp)
            );
    }
  

при отладке мой код генерирует этот SQL-запрос :

 DECLARE @EntityKeyValue1 AS SQL_VARIANT;
SET @EntityKeyValue1 = Null;

SELECT 
    [Extent2].[Id] AS [Id], 
    [Extent2].[Ex_Id] AS [Ex_Id], 
    [Extent2].[Name] AS [Name], 
    [Extent2].[Factor] AS [Factor]
    FROM  [dbo].[LsnToGrp] AS [Extent1]
    INNER JOIN [dbo].[Group] AS [Extent2] ON [Extent1].[Grp_Id] = [Extent2].[Id]
    WHERE [Extent1].[Lsn_Id] = @EntityKeyValue1
  

Это не так, я хочу найти урок в группе

Найдите уроки, в которых идентификатор группы

Комментарии:

1. Почему вы используете d.Group.Equals(grp) ? Это скрывает тот факт, что вы сравниваете несовместимые типы (коллекция против экземпляра). Измените его на d.Group == grp , чтобы увидеть, что не так.

2. Попробуйте d => d.Group.Select(x => x.Id).Contains(grpId)

3. @GertArnold Я изменил, но Sql-запрос не chenge, а inner join LsnToGrp с Group и Where Lsn_Id =

4. @dotctor спасибо, это решение работает. пожалуйста, отправьте в качестве ответа

5. @dotctor почему в вашем решении EF выполнение запроса для каждого урока находится в таблице уроков? является ли лучшим решением отправить один запрос для извлечения данных? (в этом шаблоне n-уровневый уровень)

Ответ №1:

Вы должны проверить, содержат ли группы, связанные с этим уроком, указанный идентификатор группы

 public IList<Lesson> GetLessonWhereGrpId(int grpId)
{
    return _LessonRepository.GetList(
        d => d.Group.Any(x => x.Id == grpId)
        );
}
  

Но почему бы не получить уроки, связанные с указанной группой?

 public IList<Lesson> GetLessonWhereGrpId(int grpId) 
{ 
    GroupBLL grpbll = new GroupBLL(); 
    grp = grpbll.GetGroupById(grpId, g => g.lesson); 

    return grp.lesson.ToList(); 
}