什么是捕获(在LINQ中选择new而不是简单地填充对象)

时间:2009-10-16 10:28:33

标签: sql-server linq exception

有人可以解释这两段代码之间的区别:

var temp = (from c in Context.SomeTable 
            select new SomeObject { name=c.Name, created = c.Created}).ToList();

和此:

var temp = (from c in Context.SomeTable select c);
foreach(SomeTable t in temp)
{
SomeObject so = new SomeObject();
so.name = t.Name;
so.created = t.Created;
}

SomeTable.Created是数据库中可以为空的日期时间类型字段。

虽然第一件作品引发了异常:

Sqldatetime overflow. must be between 1/1/1753 12:00:00 am and 12/31/9999 11:59:59 pm.

第二个有效。

谢谢!

1 个答案:

答案 0 :(得分:1)

在第一个代码中,c将不会读取SomeTable,或者SomeObject的实例将被创建,直到枚举temp为止。

第二次进行此枚举。

因此,我认为在第一种情况下枚举Context.SomeTabletemp的有效性存在问题。

通过将第一个块更改为:

来测试此项
var temp = (from c in Context.SomeTable 
            select new SomeObject { name=c.Name, created = c.Created}
           ).ToList();

强制立即枚举。