LINQ - .Select(n => n.Name)和.Select(n => new {n.Name})之间的区别;

use*_*543 5 .net c# linq entity-framework

我是Linq的新手,想知道你是否可以帮我理解以下Linq之间的区别?例如...

//normal select
var contacts = entity.Contacts.Select(n => n.FirstName);

//select new
var contacts2 = entity.Contacts.Select(n => new { n.FirstName });

//normal select output
foreach (var c in contacts)
    Response.Write(c + "<br/>");

//select new output
foreach (var c in contacts2)
    Response.Write(c.FirstName + "<br/>");
Run Code Online (Sandbox Code Playgroud)

我能看到的唯一区别是,在正常选择中,firstname(字符串)存储在集合中,而在select new中,联系对象存储在collecton中,firstname由其属性访问.select new也返回仅在语句中选择的属性.

我注意到的另一个不同之处是您可以在select new中返回多个特定属性.

在什么情况下你会选择一个而不是另一个?

谢谢您的帮助.

Ric*_*ett 20

n => n.FirstName 给你一个 string

n => new { n.FirstName }为您提供一个匿名类型,其中包含一个string属性FirstName

一般来说,只有一个属性的匿名类型可能不是你想要的,所以我会选择第一个选项.


TCM*_*TCM 6

支持Richard Ev的答案:

如果您不熟悉匿名类型,请破解ildasm并将您的exe作为输入.

你会得到这样的东西:

在此输入图像描述

你看到以<> f_AnonymousType()开头的东西是Richard Ev所说的那个.你的语法new被翻译成一个新类(名称由编译器决定).这就是为什么var关键字在使用匿名类型时如此有用.