为什么我不能这样做:
usuariosEntities usersDB = new usuariosEntities();
foreach (DataGridViewRow user in dgvUsuarios.Rows)
{
var rowtoupdate =
usersDB.usuarios.Where(
u => u.codigo_usuario == Convert.ToInt32(user.Cells[0].Value)
).First();
rowtoupdate.password = user.Cells[3].Value.ToString();
}
usersDB.SaveChanges();
必须这样做:
usuariosEntities usersDB = new usuariosEntities();
foreach (DataGridViewRow user in dgvUsuarios.Rows)
{
int usercode = Convert.ToInt32(user.Cells[0].Value);
var rowtoupdate =
usersDB.usuarios.Where(u => u.codigo_usuario == usercode).First();
rowtoupdate.password = user.Cells[3].Value.ToString();
}
usersDB.SaveChanges();
我必须承认它是一个更易读的代码,但为什么不能这样做呢?
答案 0 :(得分:9)
关于它的是LINQ查询由编译器转换为表达式树。然后将此表达式树转换为T-SQL并传递给服务器。 LINQ to SQL将某些方法(如String.Contains)映射到T-SQL等效项。
在第一个示例中,LINQ显然没有将Convert.ToInt32映射到任何内容并抛出异常。它在第二个示例中工作的原因是因为Convert.ToInt32调用在查询的外部完成,因此它不是表达式树的一部分,不需要转换为T-SQL
This MSDN page描述了LINQ to SQL如何将各种数据类型,运算符和方法转换为T-SQL。 (虽然文档确实建议支持Convert.ToInt32,所以我不确定这里还会发生什么。)
很抱歉刚才意识到这是ADO.NET实体框架,而不是LINQ to SQL。 This page lists ADO.NET实体框架映射。它有点限制性,主要是因为它需要与多个提供商合作。
答案 1 :(得分:0)
因为你的LINQ to Ent。没有使用所有元数据将查询编译到MSIL中,而只是将查询转换为一些extantion方法,并且受限于语言的lambda解析能力。这意味着
此代码:
var results = from c in SomeCollection
where c.SomeProperty < someValue * 2
select new {c.SomeProperty, c.OtherProperty};
与此相同:
var results =
SomeCollection
.Where(c => c.SomeProperty < someValue * 2)
.Select(c => new {c.SomeProperty, c.OtherProperty});