【问题标题】:'IN' & 'NOT IN' in Linq queryLinq 查询中的“IN”和“NOT IN”
【发布时间】:2010-11-29 05:13:13
【问题描述】:

我在 LINQPad 中测试了以下查询,它运行良好,但 VS2010 不喜欢它。

var topJobs = from j in streetlightDBEntities.Job
    let mjobid = from m in streetlightDBEntities.Job.Include("Streetlight")
                 where m.Streetlight.StreetlightId == j.Streetlight.StreetlightId
                 orderby m.DateCompleted descending
                 select m.JobId
        where mjobid.Take(5).Contains(j.JobId)
        select j.JobId;

var notTopJobs = streetlightDBEntities.Job.Where(c => !topJobs.Contains(c.JobId));

我收到以下错误:

LINQ to Entities 无法识别方法 'Boolean Contains[String](System.Linq.IQueryable`1[System.String], System.String)' 方法,并且此方法无法转换为存储表达式。

【问题讨论】:

  • 您的目标是 .NET 3.5 还是 .NET 4.0?

标签: c# linq entity-framework entity-framework-4 linq-to-entities


【解决方案1】:

使用Queryable.Any<TSource>。

而不是这个:

var notTopJobs = streetlightDBEntities
      .Job
      .Where(c => !topJobs.Contains(c.JobId));

这样做:

var notTopJobs = streetlightDBEntities
      .Job
      .Where(c => !topJobs.Any(x => x.JobId == c.JobId))

对您的原始查询执行相同的操作。

【讨论】:

  • x.JobId 错误:'string' 不包含'JobId' 的定义,并且找不到接受'string' 类型的第一个参数的扩展方法'JobId'
  • 那么你的新的第一个查询是错误的。我基于您最初的查询topJobs,该查询选择了JobId。您的topTops 查询是否在选择/投影中返回JobId?
猜你喜欢
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多