2012-03-01 13 views
1

のこの他の結果セットにある場合、私はBuildingPrice.ShedStyleプロパティがShedStyles.Where(...)LINQ - 特定のプロパティがプロパティのタイプ

var prices = db.BuildingPrices.Where(
    p => p.ShedStyle.IsAmong(//There must be some obvious method for this 
     db.ShedStyles.Where(s => s.Name.Contains("text") 
    ); 

public class BuildingPrice 
{ 
    public ShedStyle ShedStyle { get; set; } 
} 
public class ShedStyle 
{ 
    public string Name { get; set; } 
} 
public class Context : DbContext 
{ 
    public DbSet<BuildingPrice> BuildingPrices { get; set; } 
    public DbSet<ShedStyle> ShedStyles { get; set; } 
} 

答えて

1

これは少し遅く、私の脳は完全な能力ではありません。なぜなら、これは結合で行うことができると信じるからですが、それがなければ、ここで私が思い付いたのです。あなたはちょうどこれを少し後ろに持っていました。

 var prices = db.BuildingPrices.Where 
      (
       p => db.ShedStyles 
        .Where(s => s.Name.Contains("text")) 
        .Contains(p.ShedStyle) 

      ); 
+0

BrokenGlassは、オブジェクトを介してこれを直接クエリする方が表現力のあるアプローチになります。 –

+1

これまでのところ、文字列に 'Contains'を使用していただけで、想像上の' IsAmong'拡張 – Benjamin

1
var prices = db.BuildingPrices.Where(
p => db.ShedStyles.Where(s => s.Name.Contains("text")).Contains(p.ShedStyle)); 
+0

ありがとう - 私が考えていたのみを含む文字列のためだった - 私は簡単な例を作ってみるが、時々、彼らは私が:) – Benjamin

3

の結果あなた間になりますすべてのBuildingPriceを見つけたい結果を得ますAny()またはContains()でこれを行うことができます:

var prices = db.BuildingPrices.Where(
p => db.ShedStyle.Where(s => s.Name.Contains("text")).Any(x=> x.Name == p.ShedStyle.Name)); 

しかしGIVなぜあなたは条件を直接テストできないのですか?

var prices = db.BuildingPrices.Where(p=> p.ShedStyle.Name.Contains("text")); 

後者のアプローチははるかに簡単です。

+0

分かりませんだから、 'Any'と' Contains'は時々互換性を持って使用されるかもしれませんが、コンストラクタの代わりに直接渡すだけです。 – Benjamin

+0

後だ質問をバイパスしても簡単に解決策を持ってしまう理由 – Benjamin

関連する問題