1

我有在運行時傳入我的函數的未知數量的複雜鍵。它們的結構如下:在Entity Framework 5 CodeFirst中,如何創建一個將在任何一對值發現時返回的查詢?

var keys = new List<List<string>> 
{ 
    new List<string> { "1", "a" }, 
    new List<string> { "2", "b" }, 
    new List<string> { "3", "c" } 
}; 

內部列表將始終有兩個值。外部列表可以有n個值。我試圖查詢一個表,其中記錄與列表中的任何對匹配。我想這個查詢是這樣的:

var filtered = 
    dataContext.T.Where(
     s => keys.Any(k => 
       k[0] == s.Column0 
       && k[1] == s.Column1)); 

在這一點上,因爲它似乎LINQ是無法處理的。任何()方法中列出(或陣列?)LinqToEntities失敗。

這是錯誤,當我運行此代碼,我得到:

"LINQ to Entities does not recognize the method 'System.String get_Item(Int32)' method, and this method cannot be translated into a store expression." 

所以我的問題是,我怎麼能查詢匹配在列表中的任何一對值的記錄?只要我可以查詢任何一組對,我就可以改變結構的任何內容。

感謝您的任何指導。

+0

而不是兩個項目列表的列表,你有沒有考慮使用元組列表?不太瞭解實體可以肯定地說,但它可能有幫助。 –

+0

嗯。我會盡快嘗試。 – quakkels

+0

不幸的是,元組的想法不起作用:{「無法創建類型爲'System.Tuple'2的常量值。在這種情況下只支持原始類型或枚舉類型。」} – quakkels

回答

2

不要以爲你可以在linq 2實體中使用任何類似的枚舉。

一種解決方法是連接你的對,中間有一個「永不出現」的字符串。

var concatenatedkeys = keys.Select(m => m[0] + "~" + m[1]).ToList(); 

var filtered = 
    dataContext.T.Where(s => concatenatedKeys.Contains(
              s.Column0 ?? string.Empty + 
              "~" + 
              s.Column1)); 
+0

這需要EF列舉結果爲了比較? – quakkels

+0

@quakkels不,它不會,l2E能夠做字符串連接。 –

+0

它一開始並沒有工作,但後來我意識到列是char而不是varchar。我只需要添加一個'.Trim()',它就像一個魅力。謝謝!你救了我的培根! – quakkels

0

答案確實解決了我在問題中提出的問題。但是,一旦我需要比較鏈接實體中的值時,我遇到了類似的問題。

級聯解決方案遇到了與此場景中的問題:

var filtered = 
    dataContext.T.Where(s => concatenatedKeys.Contains(
              s.AnotherEntity.Column0 ?? string.Empty + 
              "~" + 
              s.AnotherEntity.Column1)); 

爲了解決這個問題,我結束了使用LinqKit創建使用PredicateBuilder的。凡()的表達。

相關問題