当前位置: 首页 > 编程语言 > C#

为什么LINQtoEntities不能识别某些方法?Share

时间:2023-04-10 13:57:55 C#

为什么LINQtoEntities不能识别某些方法?为什么我不能这样做:usuariosEntitiesusersDB=newusuariosEntities();foreach(DataGridViewRowuserindgvUsuarios.Rows){varrowtoupdate=usersDB.usuarios.Where(u=>u.codigo_usuarios==Convert.ToInt32(user.Cells[0].Value)).First();rowtoupdate.password=user.Cells[3].Value.ToString();}usersDB.SaveChanges();并且必须做:usuariosEntitiesusersDB=newusuariosEntities();foreach(dgvUsuarios.Rows中的DataGridViewRow用户){intusercode=Convert.ToInt32(user.Cells[0].Value);varrowtoupdate=usersDB.usuarios.Where(u=>u.codigo_usuarios==usercode).First();行更新。密码=user.Cells[3].Value.ToString();}usersDB.SaveChanges();我必须承认这是一个更具可读性的代码,但为什么不能这样做呢?关于它的事情是LINQ查询被编译器转换为表达式树。然后将此表达式树转换为T-SQL并传递给服务器。LINQtoSQL将某些方法(如String.Contains)映射到T-SQL等价物。在第一个示例中,LINQ显然不会将Convert.ToInt32映射到任何内容,并引发异常。它在第二个示例中起作用的原因是因为Convert.ToInt32调用是在查询之外完成的,所以它不是表达式树的一部分,不需要转换为T-SQL。此MSDN页面描述了LINQtoSQL如何将各种数据类型、运算符和方法转换为T-SQL。(尽管文档确实建议支持Convert.ToInt32,所以我不确定这里还发生了什么。)抱歉,刚刚意识到这是ADO.NETentity框架,而不是LINQtoSQL。此页面列出了ADO.NETentity框架映射。它有点限制,主要是因为它需要与多个提供商合作。因为你的LINQtoEnt。它不是将查询与所有元数据一起编译到MSIL中,而是只是将查询翻译成一些扩展方法,并且受到语言的lambda解析功能的限制。这意味着此代码:varresults=fromcinSomeCollection其中c.SomeProperty与此相同:varresults=SomeCollection.Where(c=>c.SomeProperty.Select(c=>new{c.SomeProperty,c.OtherProperty});以上就是C#学习教程:为什么LINQtoEntities不能识别某些方法?分享的全部内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——-本文来自网络收藏,不代表立场,如涉及侵权,请点击右边联系管理员删除,转载请注明出处: