2013-05-29 124 views
1
var emp = (from a in AdventureWorks.PersonPhones 
           join b in AdventureWorks.People 
           on a.BusinessEntityID equals b.BusinessEntityID 
           join c in AdventureWorks.PhoneNumberTypes 
           on a.PhoneNumberTypeID equals c.PhoneNumberTypeID 
           select new { a, b, c }).OrderBy(n => n.c.Name); 

我有這個linq查詢選擇匿名類型的值。 我只想將這個查詢傳遞給somemethod(),並在該方法中存儲在「emp」中的此查詢上調用toList()。 謝謝!通過linq選擇查詢的方法

+0

http://stackoverflow.com/questions/55101/how-can-i-pass- an-anonymous-type-to-a-method http://stackoverflow.com/questions/6624811/how-to-pass-anonymous-types-as-parameters – dugas

+0

您可以將此類型表示爲'IEnumerable '。雖然我不確定您是否可以將它作爲方法的參數類型?更好的是,爲什麼不爲'{a,b,c}'創建一個類類型,然後將其作爲'IEnumerable '傳遞給它? – Porkbutts

回答

1

您不能以強類型的方式傳遞匿名類型(僅作爲對象)。您將不得不創建一個類型來表示匿名類型結構,對對象類型使用反射,或者使用ToList()等方法工作。

0

你可以把它作爲IQueryable<dynamic>

public void SomeQueryMethod(IQueryable<dynamic> query) 
{ 
     var result = query.First(); 

     var a = result.a; //dynamic resolution 
} 
.... 
SomeQueryMethod(emp); //this should work 

但在方法上的結果對象的所有屬性訪問將是「動態的」,沒有編譯時檢查。

1

有可能以不關心它是否是匿名類型的方式來做到這一點 - 如果您通過一種方法來挑選相關屬性,您甚至可以對其進行一些操作。

private static void Process<T>(IEnumerable<T> data, Func<T, string> selector) { 
    foreach (var item in data) { 
     Console.WriteLine(selector(item)); 
    } 
} 

var items = from i in db.table 
      select new { property = i.originalProperty, ignored = i.ignored }; 
Process(items, (item => item.property)); 

這另一種方法是隻選擇你想要的屬性到一個新的列表

var items = from i in db.table 
      select new { prop1 = i.prop1, prop2 = i.prop2 }; 
// ... cut ... do something that requires everything in items ... 
IEnumerable<string> justFirstProperties = items.Select(i => i.prop1); 
Process(justFirstProperties); 
+0

供參考:http://stackoverflow.com/questions/6624811/how-to-pass-anonymous-types-as-parameters – Shog9