在我的应用程序中,我尝试使用EntityFramework,Repository Pattern执行Join查询,这将引发以下错误。 链接查询中的问题是什么?让我详细解释
错误描述
无法创建类型为<< [匿名类型的常量值。只要在此上下文中支持基本类型或枚举类型]
初始化
_repository = new GenericRepository<WeeklyEntry>();
_repositoryGroup = new GenericRepository<Group>();
_repositoryGroupMember = new GenericRepository<GroupMember>();
获取逻辑
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();
List
)连接:您正在通过调用ToList
将它们转换为内存中的集合:
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();
然后您尝试加入下一部分代码。如果简单地删除那些
ToList
调用,则联接应该起作用(如果愿意,可以保留一个以得到最终结果)。[请记住,
IEnumerable
是惰性的,并且仅当您通过迭代(通常是通过foreach
循环或某些函数,例如ToList
来“执行” SQL时才实际运行SQL查询。