C#LINQ问题,为什么需要新的?

时间:2010-04-30 14:21:33

标签: c# .net linq

为什么我们需要其中一个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;

7 个答案:

答案 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.TimestampsampleDataTable.SampleDataIdsampleInfoTable.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运算符。如果它也没有问题。