gpt4 book ai didi

c# - 为什么 LINQ to Entities 不能识别某些方法?

转载 作者:太空狗 更新时间:2023-10-29 21:20:22 24 4
gpt4 key购买 nike

为什么我不能这样做:

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();

我必须承认这是一个更具可读性的代码,但为什么不能这样做呢?

最佳答案

关于它的事情是 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 Entity Framework ,而不是 LINQ to SQL。 This page lists ADO.NET Entity Framework 映射。它有更多限制,主要是因为它需要与多个提供商合作。

关于c# - 为什么 LINQ to Entities 不能识别某些方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2466495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com