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))