为什么在此上下文中仅支持原始类型或枚举类型?

问题描述 投票:0回答:1

在我的应用程序中,我尝试使用EntityFrameworkRepository 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();
entity-framework linq join entity-framework-6 repository-pattern
1个回答
0
投票
您无法将数据库表与内存中的集合(在您的情况下为List)连接:

Unable to create a constant value of type Only primitive types or enumeration types are supported in this context

您正在通过调用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查询。

© www.soinside.com 2019 - 2024. All rights reserved.