2011-02-01 136 views
2

我試圖從查詢中獲取匿名對象:匿名類型的LINQ

var myList = from td in MyObjectList 
      select new 
      { 
       a = td.a, 
       b = td.b, 
       c = td.c, 
       name = (from r in contex.NewList 
         where r.aa == td.a && r.bb == td.b 
         select r.Name).ToList() 
      }; 

我想的名字有r.Name價值,因爲我想到,名單隻包含一個元素。如果它包含0個元素,我希望名稱具有值NONE,如果多於1個元素,則應拋出異常或其他東西。

它甚至有可能實現這樣的事情嗎?感謝幫助。

回答

7

而不是.ToList()使用

.SingleOrDefault() ?? (td.a == 0 ? "XNone" : "None") 

編輯:基於評論更改前面回答。

另外我會建議不要把這樣的邏輯放到Linq-to-SQL中。有時候,這可能會導致大量高度未優化的SQL代碼,除非您不介意某些性能問題,否則會導致SQL執行速度變慢。

+0

+1:尼斯使用空凝聚運營商 – 2011-02-01 09:42:48

+0

的。如果我想,如果上面顯示「無」是真的,如果上面是「XNone」,那麼td.a == 0? – gruber 2011-02-01 09:53:28

2

您可以使用SingleOrDefault和表達式中的臨時變量來實現該功能。事情是這樣的:

var myList =  
from td in MyObjectList 
let nameValue = contex.NewList 
        .Where(r => r.aa== td.a && r.bb == td.b) 
        .Select(r => r.Name) 
        .SingleOrDefault() 
select new 
{ 
    a = td.a, 
    b = td.b, 
    c = td.c, 
    name = nameValue ?? "NONE" 
}; 

更新:,而不是呈現幾乎相同的解決方案@Euphorics answer,我已調整了一下代碼。我經常發現嵌套的LINQ表達式讓事情變得不可讀。將理解語法轉換爲調用鏈可以改善這一點。

更新2:增加了一些要求,以下select應該做的伎倆:

select new 
{ 
    a = td.a, 
    b = td.b, 
    c = td.c, 
    name = nameValue ?? (td.a == 0 ? "XNone" : "None") 
};