В моем приложении я пытаюсь выполнить запрос Join , используя EntityFramework , Шаблон репозитория , выдает ошибку ниже. В чем проблема в запросе link ? Позвольте мне объяснить подробнее
Описание ошибки
Невозможно создать постоянное значение типа ' Анонимный тип '. В этом контексте поддерживаются только примитивные типы или типы перечисления
Инициализация
_repository = new GenericRepository<WeeklyEntry>();
_repositoryGroup = new GenericRepository<Group>();
_repositoryGroupMember = new GenericRepository<GroupMember>();
Выборка Logi c
var groups = _repositoryGroup.GetAll().OrderBy(o => o.ID)
.Select(s => new { s.ID, s.Name }).ToList();
var groupMembers = _repositoryGroupMember.GetAll().OrderBy(o => o.ID)
.Select(s => new { s.GroupID, s.ID, s.Name })
.ToList();
Основной запрос [Не работает]
var results = (from we in _repository.GetAll()
join g in groups on we.GroupID equals g.ID into grpjoin
from g in grpjoin.DefaultIfEmpty()
join gm in groupMembers on we.DepositedByMemberID equals gm.ID into gmjoin
from gm in gmjoin.DefaultIfEmpty()
where gm.GroupID == g.ID
select new
{
GroupID = g.ID,
GroupName = g.Name,
MemberID = grpmresult.ID,
grpmresult.Name,
we.ID
}).ToList();
Чтобы попытаться достичь ниже SQL Запрос
select w.GroupID, g.Name, gm.Name, w.ID
from [dbo].[WeeklyEntry] as w
left outer join [dbo].[Group] as g on g.ID = w.GroupID
left outer join [dbo].[GroupMember] as gm on gm.GroupID = g.ID
AND gm.ID = w.DepositedByMemberID
order by w.GroupID
Странные выводы
Если я включу .ToList();
с каждым запросом, например from we in _repository.GetAll().ToList()
, весь запрос будет работать и даст ожидаемый результат без ОШИБКИ !!!
Таким образом, если я преобразую каждый тип возвращаемого запроса в оперативную память или IEnumerable<>
, он будет работать, как и ожидалось, без каких-либо ошибок, но запрос IQueryable<>
не будет работать, как ожидалось.
Новый фрагмент кода [Рабочий]
var results = (from we in _repository.GetAll().ToList()
join g in groups on we.GroupID equals g.ID into grpjoin
from g in grpjoin.DefaultIfEmpty()
join gm in groupMembers on we.DepositedByMemberID equals gm.ID into gmjoin
from gm in gmjoin.DefaultIfEmpty()
where gm.GroupID == g.ID
select new {...}.ToList();