2011-10-21 42 views
11

我有一個查詢從數據庫中提取:如何使用來自查詢中的另一個對象的值來設置來自linq查詢的所有項目的屬性?

List<myClass> items = new List<myClass>(from i in context 
         select new myClass 
         { 
          A = i.A, 
          B = "", // i doesn't know this, this comes from elsewhere 
          C = i.C 
         } 

我也有另外一個查詢做了類似的事情:

List<myClass2> otherItems = new List<myClass2>(from j in context 
          select new myClass2 
          { 
           A = j.A, // A is the intersection, there will only be 1 A here but many A's in items 
           B = j.B 
          } 

在現實中,這些類是不僅分離更大和查詢數據通過數據庫,但通過服務器。是否有可能使用LINQ查詢來填充屬性B的所有items其中items.A相交?所有內置的LINQ謂詞僅出現在聚合,選擇或bool表達式中。

在我的大腦我有這樣的事情,但這是全部關閉:

items.Where(x => x.B = (otherItems.Where(z => z.A == x.A).Single().B)); 

還是我是可笑的,試圖使這項工作在LINQ和應該只放棄它贊成的for循環實際設置變得微不足道?由於截止日期的原因,我將採用for循環(無論如何,這可能最終會在長時間內更具可讀性),但是可以這樣做嗎?是否需要擴展方法來添加一個特殊的謂詞來允許這樣做?

+0

我想說你的for循環是一個很好的實現。 – JonH

+0

你能展示一個簡單的數據集,它具有你正在尋找的主體結構嗎?最後一個查詢試圖達到什麼目的? – Tormod

+0

@Tormod:第二個查詢包含'B'變量。我正在尋找一個將在第一個集合中執行'B'變量的謂詞或擴展方法。 –

回答

21

LINQ是專爲查詢。如果你想設置的事情,你一定要使用一個循環(可能foreach)。這並不意味着您將無法使用LINQ 作爲環的一部分,但你不應該嘗試應用內LINQ本身的副作用。

+0

矛盾可能是插入,更新和刪除的用法。這表明它可能不僅僅是爲查詢而設計的。我可以同意,在框架中打包的默認謂詞只針對查詢,但是這讓我懷疑是否應用全面的擴展方法,如果它可能超出簡單查詢範圍。我完全認識到「可以」與「應該」之間的區別。在這一點上,我正在探索這種可能性(並試圖填補我自己的LINQ知識中的空白)。 –

+0

@JoelEtherton:他們是特定LINQ提供者的一部分 - 他們不是LINQ本身的一部分。每個LINQ提供者都是「LINQ模式之後的查詢部分」以及其他提供者特定的部分。 –

+0

我認爲像這樣的東西適合LINQ to Objects,但我可以理解它爲什麼不是默認實現。所以在你看來,如果我需要這樣的東西來證明工作成本,那麼實現我自己定製的LINQ到MyNamespace提供程序是必要的(謹慎?)。 –

0
第一

查詢的OtherItems。對結果執行ToDictionary()。然後,在查詢數據庫時,這樣做:

var items = from i in context 
    select new myClass 
    { A = i.A, 
    B = otherItems[i.A], 
    C = i.C 
    } 
+0

LINQ不允許數據查詢和內存查詢的組合。它會編譯,但會產生一個運行時異常,因爲本地序列不能用於數據上下文。爲了讓數據查詢部分能夠工作,它必須執行它並將其帶到本地序列,然後執行另一個選擇,這將創建一個冗餘查詢(我將使用LINQ來避免)。 –

+0

對。本地關閉不會通過表達式樹轉換成LINQ查詢提供程序。那麼,這取決於你想如何執行查詢。如果您希望對查詢進行延遲評估,那麼迭代時可能會多次觸及它。但我想你可以通過做src.Select(remdata => new {})。AsEnumerable()。Select(localdata => new {A = ld.a,B = otherItems [ld.a],C = ld 。C}) – Tormod