2012-03-01 36 views
1

我要找到每一個BuildingPrice其中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

有點晚了,我的大腦並沒有滿負荷,因爲我相信這可以通過Join來完成,但是如果沒有它,這就是我想出的。你只是有點倒退了。

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

      ); 
+0

BrokenGlass是正確的,直接通過對象查詢將是更具表現力的方法 – 2012-03-01 03:47:59

+1

我只使用了'包含'字符串到目前爲止,並沒有意識到它是我想象中的'IsAmong'擴展的反面 - 謝謝 – Benjamin 2012-03-01 04:19:29

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

謝謝你 - 我在想是包含字符串唯一的 - 不知道爲什麼 – Benjamin 2012-03-01 04:23:44

3

結果之間可以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

我儘量讓簡單的例子,但有時他們最終有更容易的解決方案,繞過:) – Benjamin 2012-03-01 04:13:10

+0

後,我的問題所以看起來'Any'和'Contains'有時可以互換使用,但是w/Contains只是直接傳遞它的對象而不是比較器的東西。 – Benjamin 2012-03-01 04:22:51