Linq:将数据选择为多个列表

时间:2012-06-27 15:53:30

标签: c# linq entity-framework linq-to-sql

如何将查询结果选择为多个列表?例如,

class Person 
{
   public string FirstName {get;set;}
   public string LastName {get;set;}
}

void test()
{
   var query =
     from i in Persons
     select i;

   // now i want to select two lists - list of first names, and list of last names

   // approach 1 - run query twice?
   List<string> f = query.Select( i=>i.FirstName).ToList();
   List<string> l = query.Select( i=>i.LastName).ToList();

   // approach 2 - turn it into a list first, and break it up
   List<Person> p = query.ToList();
   List<string> f = p.Select( i=>i.FirstName).ToList();
   List<string> l = p.Select( i=>i.LastName).ToList();
}

方法1的问题是我需要运行两次查询。 方法2的问题是我使用两倍的内存。当数据集很大时,它可能会成为一个问题。

2 个答案:

答案 0 :(得分:4)

  

方法1的问题是我需要运行两次查询。方法2的问题是我使用两倍的内存。当数据集很大时,它可能会成为一个问题。

这些权衡中的任何一个都可能足够,但这取决于最终的数据集和用例。

但是,如果你想完全避免这种权衡,你可以。解决这个问题的方法是不使用Linq:

var firstNames = new List<string>();
var lastNames = new List<string>(); 
foreach(var person in query)
{
   firstNames.Add(person.FirstName);
   lastNames.Add(person.LastName);
}

这可以避免两个查询以及项目的“复制”,因为您只枚举一次查询结果,并且不存储任何额外信息。

答案 1 :(得分:0)

  

方法2的问题是我使用了两倍的内存。

错误。测量它。字符串实例被重用。