2016-10-27 6 views
1

linqをエンティティ6のコードから先に使用します。エンティティEF6を使用して行をフェッチしようとするとエラーが発生する

public class Site 
    { 
     public int Id { get; set; } 
     public int UID { get; set; } 
     public string Name { get; set; } 
     public string Description { get; set; } 
     public int? ContractId { get; set; } 
     public int? SiteTypeId { get; set; } 

     public virtual ICollection<SiteRegion> Regions { get; set; } 
    } 


    public class SiteRegion 
    { 
     public int Id { get; set; } 
     public int UID { get; set; } 
     public int? SiteId { get; set; } 
     public string Name { get; set; } 
     public int? RegionTypeId { get; set; } 

     [ForeignKey("SiteId")] 
     public virtual Site Site { get; set; } 

    } 

あなたが見ることができるように地域の上にあるフィールドが制約であると私は、テーブルには1対多の関係を持っている:

はここで2つのエンティティクラスです。

私はサイトのテーブルから目的の行をフェッチするために、このLINQクエリを作成しました:

int?[] ContractId = [1,2]; 
int?[] siteTypeId = [1,2,3]; 

var result = (from sites in context.Set<Site>() 
       where contractsIDList.Contains(sites.ContractId) && 
       siteTypeId.Contains(sites.SiteTypeId) && 
       select sites).AsNoTracking<Site>(); 

、それが正常に動作します。

今、私は新しい要件を持っていると私はSiteRegionテーブルにRegionTypeId列でも、私のクエリをフィルタ処理する必要があり、ここで私の新しいクエリです:

int?[] ContractId = [1,2]; 
int?[] siteTypeId = [1,2,3]; 
int?[] regionTypeId = [1,2,3]; 

var result = (from sites in context.Set<Site>() 
       where contractsIDList.Contains(sites.ContractId) && 
       siteTypeId.Contains(sites.SiteTypeId) && 
    regionTypeId.Contains(sites.Regions.SelectMany(x=>x.RegionTypeId).ToArray()) 

       select sites).AsNoTracking<Site>(); 

しかし、私はエラーを取得する:この上に

Error 36 'int?[]' does not contain a definition for 'Contains' and the best extension method overload 'System.Linq.Queryable.Contains<TSource>(System.Linq.IQueryable<TSource>, TSource)' has some invalid arguments 

行:

regionTypeId.Contains(sites.Regions.SelectMany(x=>x.RegionTypeId).ToArray()) 

希望の行を取得するために上記のクエリを修正するにはどうすればよいですか?

+0

'Contains'は単一の値ではなく、アレイを取る拡張メソッドです。おそらく、 'join'を作ることができます。 – Crowcoder

答えて

1

以下のようにする必要があります。

注:

間違っregionTypeId.Contains(sites.Regions.SelectMany(x=>x.RegionTypeId).ToArray())

正しい:regionTypeId.Any(item => sites.Regions.Select(x => x.RegionTypeId).Contains(item))

ワーキングサンプル:

int?[] contractsIDList = { 1, 2}; 
int?[] siteTypeId = { 1, 2, 3}; 
int?[] regionTypeId = { 1, 2, 3}; 

var result = (from sites in db.Set<Site>() 
       where contractsIDList.Contains(sites.ContractId) && siteTypeId.Contains(sites.SiteTypeId) 
       && regionTypeId.Any(item => sites.Regions.Select(x => x.RegionTypeId).Contains(item)) 
       select sites).AsNoTracking<Site>(); 

結果:

enter image description here

関連する問題