6

LINQPadで以下のクエリをテストしたところ、うまく動作しましたが、VS2010はそれを気に入らない。Linqクエリで 'IN'& 'NOT IN'

LINQ to Entities does not recognize the method 'Boolean Contains[String](System.Linq.IQueryable`1[System.String], System.String)' method, and this method cannot be translated into a store expression.

+0

.NET 3.5または.NET 4.0をターゲットにしていますか? – DamienG

+0

vs 2010 .NET 4.0 – Kiddo

答えて

8

使用Queryable.Any<TSource>

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

は、私は次のエラーを得ました。これに代えて

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

があなたの元のクエリのために同じことを行います

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

はこれを行います。

+0

x.JobIdのエラー: 'string'に 'JobId'の定義が含まれておらず、拡張メソッド 'JobId'が 'string'タイプの最初の引数を受け入れることができませんでした。 – Kiddo

+0

最初のクエリが間違っています。私はあなたが元々持っていたクエリに 'topJobs'に基づいて、' JobId'を選択しました。あなたの 'topTops'クエリは選択/投影で' JobId'を返しますか? – RPM1984