为什么我们需要其中一个new
语句中的select
?
var runs = from sampleDataTable in db.SampleData
from sampleInfoTable in db.SampleInfo
where sampleDataTable.SampleInfo.SampleInfoId == sampleInfoTable.SampleInfoId
select new {sampleDataTable.Timestamp, sampleDataTable.SampleDataId, sampleInfoTable.Lane} ;
和
var runs2 = from sampleDataTable in db.SampleData
from sampleInfoTable in db.SampleInfo
where sampleDataTable.SampleInfo.SampleInfoId == sampleInfoTable.SampleInfoId
&& sampleDataTable.Timestamp == timestamp
select sampleInfoTable.Lane;
答案 0 :(得分:6)
因为您选择的是新的匿名类型,而不是单个属性。
示例1将包含匿名类型的IQueryable
..
每个元素都将包含具有您定义的属性的类型。例如:
foreach (var result in resultset)
{
Console.Writeline(string.Format("{0}\n{1}\n{2}\n{3}\n",
result.TimeStamp,
result.SampleDataId,
result.Lane));
}
答案 1 :(得分:6)
我认为new是必需的,因为您正在创建一个包含select语句中的列和类型的新匿名类型。
答案 2 :(得分:4)
因为您在第一种情况下创建了包含sampleDataTable.Timestamp
,sampleDataTable.SampleDataId
和sampleInfoTable.Lane
的匿名类型的新实例,而在第二种情况下,您只是选择{{1 }}。
答案 3 :(得分:4)
在第一个示例中,您要选择三个属性,但某些类型T的返回类型必须为IEnumberable<T>
。对于select
,您只能为每个项目选择一个T
您正在选择的集合。因此,您必须创建一个包含三个属性的对象,并选择对该对象的引用。这就是new在这里所做的事情 - 它创建了一个匿名类型的对象,其中包含您请求的三个属性。
在第二个示例中,您只需要选择对一件事的引用。类型T
可以是属性的类型,因此您不需要将其包装为匿名类型。第二个例子也适用于new
,它没有必要。
答案 4 :(得分:0)
每次遍历Linq记录集时,您将选择一个匿名类型的 New 实例,其中包含您在linq select中声明的属性。
答案 5 :(得分:0)
在第二个中,您只是选择Lane,因此编译器知道run2
将是Lane类型的可枚举。
第一个,您选择了几个字段,编译器执行此操作的方式是创建一个具有3个属性的新类,一个类型为timestamp(datetime?),另一个为datasampleId(int?),以及另一种类型的车道。您不会看到这种类型的类,它们是编译器生成的,并且只能在方法的范围内工作(您无法返回它们或将它们作为参数发送)。告诉编译器执行此操作的语法是使用新的。
这些类型称为anonymous types
,因为您不知道该类型的名称是什么,只知道编译器。 (但是如果你使用反射器或其他工具,你将能够看到这些类,它们通常具有使用撇号等字符不允许使用的奇怪名称)
答案 6 :(得分:0)
Anonymous types通常用在查询表达式的select子句中,以从源序列中的每个对象返回属性的子集
通过将new运算符与对象初始值设定项一起使用来创建 Anonymous types
。
注意:此处匿名类型用于设置相应字段的属性(sampleDataTable.Timestamp, sampleDataTable.SampleDataId, sampleInfoTable.Lane
)
对于第一个类型,只有一种类型,因此不需要具有对象初始值设定项的new运算符。如果它也没有问题。