EF包含where子句
我有Resource和ResourceDetail。 MemberPoint with memberId和ResourceId。
我想获得一个成员的资源详细信息。
在SQL中,
Select d.* From ResourceDetails d Inner Join Resource on r d.ResourceId = r.Id Inner Join MemberPoint mp on r.id = mp.ResourceId where mp.memberId = 1
在EF,
var query = _context.ResourceDetails .Include(d => d.Resource) .Include(r => r.Resource.Memberpoints) .Where(e => e.Resource.Memberpoints.Where(m => m.MemberId))
我在上面写EF查询时遇到错误。
错误:System.Linq.IQueryable的未知方法’Where(?)’
您可以尝试使用包含这种方式:
var query = _context.MemberPoint.Include("Resource.ResourceDetails") .Where(m => m.MemberId == 111111);
或者尝试加入resourceId并选择包含所需数据的匿名类型:
var query = (from m in _context.MemberPoint join rd in _context.ResourceDetails on m.ResourceId equals rd.ResourceId where m.MemberId == 11111 select new { Member = m, ResourceDetail = rd })
您完全错误地使用EF。
你想要的实际上是什么
如果ResourceDetails有一个Resource,每个reasource有一个成员(不太可能)。
var query = _context.ResourceDetails .Include(d => d.Resource) .Include(r => r.Resource.Memberpoints) .Where(d => d.Resource.Memberpoints.MemberId == 1);
如果ResourceDetails有一个资源,并且每个资源可以有多个成员。
var query = _context.ResourceDetails .Include(d => d.Resource) .Include(r => r.Resource.Memberpoints) .Where(d => d.Resource.Memberpoints.Any(m => m.MemberId == 1));
如果ResourceDetails有多个资源(不太可能),并且每个资源可以有多个成员。
var query = _context.ResourceDetails .Include(d => d.Resource) .Include(r => r.Resource.Memberpoints) .Where(d => d.Resource.Any(r => r.Memberpoints.Any(m => m.MemberId == 1)));
好的。 那么你想要的加入呢? 那是ORM的工作。 ORM映射已经知道ResourceDetails
如何链接到Members
。
那你得到的错误是什么?
好吧, IQueryable.Where()
的sig接受一个Func
并返回一个IQueryable
。
所以在你的例子中,内部Where
错了,因为你给它一个Func
。 outter错误因为你将IQueryable
传递给它(尽管编译器不知道因为它已经存在各种错误)。
TL:DR
通常,不要与EntityFramework / Linq一起加入。 EF应该在映射中具有关联,并且已经知道如何将实体连接在一起。
假设根据您的查询示例,MemberId是唯一的。 试试这个
var query = _context.ResourceDetails .Include(d => d.Resource) .Include(r => r.Resource.Memberpoints) .Where(e => e.ResourceId == e.Resource.Memberpoints.Where(m => m.MemberId == 1))