2010-04-12 103 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