EF包含where子句

时间:2014-12-30 02:42:14

标签: c# linq entity-framework

我是Resource and 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的位置(?)'

3 个答案:

答案 0 :(得分:2)

您可以尝试以这种方式使用:

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

答案 1 :(得分:2)

您完全错误地使用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映射已经知道ResourceDetailsMembers的关联方式。

那你得到的错误是什么?

好吧,IQueryable.Where()的签名需要Func<T, bool>并返回IQueryable<T>

因此,在您的示例中,内部Where是错误的,因为您给它Func<T, int>。外部Where是错误的,因为您正在向它传递IQueryable<T>(尽管编译器不知道因为它已经存在各种错误)。

TL:DR

一般情况下,不要加入EntityFramework / Linq。 EF应该在映射中具有关联,并且已经知道如何将实体连接在一起。

答案 2 :(得分:0)

假设根据您的查询示例,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))