2013-05-14 91 views
-3

我的查詢有問題。 我有兩個簡單的類。比方說在linq的Where子句中使用Contains方法

public class A{ 
    public List<B> MyCollection{get; set;} 
} 
public class B{ 
public string Id; 
} 
//I want to do something like that 
var myB = new B{Id="1"}; 
context.A.Where(x=> x.MyCollection.Contains(myB)).ToList(); 

我該如何解決這個問題?我知道我可以做類似

context.A.ToList().Where... 

但這不是個好主意,特別是我有幾千條記錄。

更新! 上下文是的EntityFramework背景和context.A代表DbSet 我仍然得到錯誤「LINQ到實體無法識別方法「布爾包含」 我也不能使用

context.A.ToList().Where(.... 

,因爲我有成千上萬的記錄,這將是低效

+0

'context.A.Where(X => x.MyCollection.Contains( myB))',除非我誤解了這個問題? – Matthew

+2

有什麼問題? – Bobson

+0

嗯,問題是我無法進入該列表,因爲'LINQ to Entities does not recognized the method Boolean Contains ...'。 – 7h4ro3

回答

0

你嘗試過這個

context.A.MyCollection.Where(x= > x.Id == myB.Id).ToList(); 
+0

class A沒有字段Id – 7h4ro3

+0

太棒了,忘了寫MyCollection :) –

1
var ans = from b in context.A.MyCollection 
      where b.Id == 1 
      select b; 

var ans = context.A.MyCollection.Where(b => b.Id == 1); 
+0

只是要清楚。 A沒有字段「Id」。我需要從數據庫上下文中獲得一個元素,它們在其字段「MyCollection」中指定了元素B – 7h4ro3

2

這爲我工作:

public class A 
{ 
    public List<B> MyCollection{get; set;} 
} 

public class B 
{ 
    public string Id; 
} 

void Main() 
{ 

    // this is what you're searching for 
    var myB = new B{Id="1"}; 


    // here are some A objects to put in your collection 
    A a1 = new A(); 
    a1.MyCollection = new List<B>(); 
    A a2 = new A(); 
    a2.MyCollection = new List<B> { myB }; 
    A a3 = new A(); 
    a3.MyCollection = new List<B> { new B {Id="1"}}; 


    // here's a List that represents your context.A 
    List<A> contextA = new List<A> {a1, a2, a3}; 


    // here's your actual search. results has a count of 1 
    var results = contextA.Where(x=> x.MyCollection.Contains(myB)); 
    Console.WriteLine(results.Count()); 
} 

注意,這僅發現A2,因爲你從字面上把對象 「MYB」 在那裏。它沒有找到a3,它是使用相同的id創建的新對象。

如果你想找到既A2和A3,你可能要到哪裏換到這樣的事情:

var results = contextA.Where(x=> x.MyCollection.Any(b => b.Id == myB.Id)); 
+0

它的工作原理是,因爲您在List上操作。對不起,我沒有提到我仍然在DbSet上工作「LINQ to Entities does not recognized the method'布爾包含」錯誤 – 7h4ro3

+3

@ 7h4ro3:莉莉的帖子中的最後一行是正確的答案。爲你的查詢使用'Contains'是錯誤的,'Any'是正確的方法。 'Contains'通過對象引用標識執行比較,但EF和數據庫通過一個鍵來管理標識,因此您需要使用鍵屬性('Id')進行比較。 – Slauma