【问题标题】:EF include with where clauseEF 包含 where 子句
【发布时间】:2014-12-30 02:42:14
【问题描述】:

我有 Resource 和 ResourceDetail。 具有 memberId 和 ResourceId 的 MemberPoint。

我想获取成员的资源详细信息。

在 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

在英孚,

   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(?)”

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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 有一个 Resource,并且每个资源可以有多个 Member。

      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<T, bool> 并返回 IQueryable<T>

      所以在你的例子中,内部Where 是错误的,因为你给它一个Func<T, int>。外部Where 是错误的,因为您将IQueryable<T> 传递给它(尽管编译器不知道这一点,因为它已经有各种错误了)。

      TL:DR

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

      【讨论】:

      • 嗨 Aron,我想按会员 ID 过滤。请解释如何在 EF 中添加 Memberpoints.MemberId == 1。
      【解决方案3】:

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

      【讨论】:

      • 如果 MemberPoint.MemberId 是唯一的。但如果 OP 声明,我会删除我的答案
      猜你喜欢
      • 2019-02-06
      • 2012-06-08
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多