加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:29:29 所属栏目:百科 来源:网络整理
导读:为什么我不能这样做: 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(); r
为什么我不能这样做:
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实体框架,而不是LINQ to SQL. This page lists ADO.NET实体框架映射.它有点限制性,主要是因为它需要与多个提供商合作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读