2010-04-12 98 views
1

如果你有一個簡單的LINQ查詢,如:如何動態地選擇從LINQ查詢兩個字段,結果

var result = from record in db.Customer 
      select new { Text = record.Name, 
          Value = record.ID.ToString() }; 

它返回一個可映射到一個下拉列表中的對象,是有可能動態指定哪些字段映射到文本和值?

當然,你可以做一個大的情況下(開關)語句,那麼每個代碼Linq查詢分開,但是這是不是很優雅。什麼是好的會是這樣的:

(僞代碼)

var myTextField = db.Customer["Name"]; // Could be an enumeration?? 
var myValueField = db.Customer["ID"]; // Idea: choose the field outside the query 

var result = from record in db.Customer 
      select new { Text = myTextField, 
          Value = myValueField }; 

回答

1

權的方式來做到這一點是閉包。

Func<Customer, string> myTextField = (Customer c) => c["Name"]; 
Func<Customer, int> myValueField = (Customer c) => c["ID"]; 

var result = from record in db.Customer 
      select new { Text = myTextField(record), 
          Value = myValueField(record) }; 

一個限制是你的myTextField的定義總是需要返回一個字符串。

+0

不錯!這是確定以字符串的回報,因爲我們可以簡單地做的ToString()以某種方式在代碼的最後一行(myValueField(記錄))。toString()方法? – 2010-04-12 03:55:19

+0

或也許Func鍵<顧客,字符串> myValueField =(用戶C)=> c.ID.ToString(); ? – 2010-04-12 03:57:05

+2

會不會有一種方法來確定在封閉的字段名稱以可變,說(用戶C)=> C [「名稱」]? – 2010-04-12 03:59:42

1

你可以嘗試像

class Customer 
     { 
      public int ID { get; set; } 
      public string Name { get; set; } 
      public string Surname { get; set; } 
     } 

var dict = new Dictionary<string, Func<Customer, string>> 
         { { "ID", (Customer c) => c.ID.ToString() }, 
         { "Name",  (Customer c) => c.Name}, 
         { "Surname", (Customer c) => c.Surname } }; 

      List<Customer> rows = new List<Customer>(); 
      rows.Add(new Customer { ID = 1, Name = "Foo", Surname = "Bar"}); 
      var list = from r in rows 
         select new { Text = dict["ID"](r), Value = dict["Name"](r) }; 

要嘗試動態訪問屬性,你可以嘗試像

var dict = new Dictionary<string, Func<Customer, string>> 
      { { "ID", (Customer c) => c.GetType().GetProperty("ID").GetValue(c,null).ToString() }, 
      { "Name",  (Customer c) => c.GetType().GetProperty("Name").GetValue(c,null).ToString()}, 
      { "Surname", (Customer c) => c.GetType().GetProperty("Surname").GetValue(c,null).ToString() } }; 
+0

這必須是我在C#中的生活見過的最酷的代碼db.Customer。這幾乎就像一個建設者設計模式:。c.GetType()的getProperty( 「ID」)的GetValue(C,空)的ToString()...很不錯的! – 2010-04-12 04:11:35