#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();
}