Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .ToList()在LINQ查询结果中的位置_C#_Asp.net Mvc - Fatal编程技术网

C# .ToList()在LINQ查询结果中的位置

C# .ToList()在LINQ查询结果中的位置,c#,asp.net-mvc,C#,Asp.net Mvc,在获取数据以填充数据网格时,我总是提取数据,制作列表并映射到我的模型,如下所示: public List<Person> GetPeople() { var data = _db.Person.ToList(); List<Person> People = new List<Person>(); foreach (var item in data) { P

在获取数据以填充数据网格时,我总是提取数据,制作列表并映射到我的模型,如下所示:

    public List<Person> GetPeople()
    {
        var data = _db.Person.ToList();
        List<Person> People = new List<Person>();

        foreach (var item in data)
        {
            Person person = new Person()
            {
                PersonId = item.PersonID,
                FirstName = item.FirstName,
                LastName = item.LastName
            };
            People.Add(person);
        }
        return People;
    }
public List GetPeople()
{
var data=_db.Person.ToList();
列表人员=新列表();
foreach(数据中的var项)
{
Person=新人()
{
PersonId=item.PersonId,
FirstName=item.FirstName,
LastName=item.LastName
};
人。添加(人);
}
还人,;
}
这很好,但为了减少代码编写量,我发现了.Select方法和(我认为是)匿名类型。所以现在我有:

    public List<Person> GetPeople()
    {
        return _db.Person.Select(d => new Person
        {
            PersonId = item.PersonID,
            FirstName = item.FirstName,
            LastName = item.LastName
        }).ToList();
    }
public List GetPeople()
{
return _db.Person.Select(d=>newperson
{
PersonId=item.PersonId,
FirstName=item.FirstName,
LastName=item.LastName
}).ToList();
}

虽然它不容易阅读,但它也很好用。两种方式都有偏好吗?

在大多数情况下,第二种方式更可取。主要区别在于:

  • 第二个示例将您的投影转换为SQL语句,只返回您请求的列
  • 第一个示例创建了两个列表,其中一个是临时列表,可以相对快速地进行垃圾收集。如果
    人员
    表相当大,则可能会出现此问题
  • 请注意,如果在
    \u db.Person
    之后没有
    ToList()
    ,则这两种方法实际上是相同的

    并且您没有创建匿名类型,因为您指定了类型(
    Person
    )。要创建匿名类型,您只需使用
    new{…properties…}


    虽然读起来不那么容易


    我认为,一旦你习惯了像
    Select
    这样的Linq语句,你就会发现它非常容易阅读。

    出于几个原因,Select方法是首选的

  • 您可以不调用toList,而是返回IQueryable,以便在将数据拉入内存之前添加诸如where子句之类的附加操作,而不是将大块数据拉入内存然后对其进行过滤

  • Select允许您仅选择所关心的字段,而不是将所有列拉入内存,只使用Select少数行。 e、 g.如果Persons实体上还有您不关心的年龄列,则select方法将不会将其存入内存,而第一种方法会


  • 仅供参考
    newperson
    ->非匿名类型。“虽然它不容易阅读,但也很好用”-在什么方面它不容易阅读?在我看来这更自然。。。你得到的每一段代码都表达了你想要的东西——源代码、你想对每个人进行的转换,最后是对列表的转换。你为什么要从一个现有的
    person
    对象创建一个新的
    person
    对象?你只是“截断”到这三列吗?我的想法是,一个人员列表应该用人员填充,所以我创建一个新的列表,然后创建一组新的人员加入其中。不确定这是否有意义。第二个例子会改变你的投影,甚至还有副作用。。。对象不会“保存”到EF和其他类似文件中的上下文中ORMs@xanatos这是一个很好的观点-我添加了一条注释,询问OP是否需要创建新对象。