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

Linq“无法将表达式转换为SQL,也无法将其视为本地表达式,”share

时间:2023-04-10 22:25:41 C#

Linq“无法将表达式转换为SQL,也无法将其视为本地表达式。”我从这个问题开始阅读,我在那里回答,现在我在这里问更基本的问题。我已将查询简化为:varq=fromentinLinqUtils.GetTable()fromtelinent.Telephones.DefaultIfEmpty()selectnew{Name=ent.FormattedName,Tel=tel!=null?tel.FormattedNumber:""//这是导致错误的原因};tel.FormattedNumber是一个将Number和Extension字段组合成格式整齐的字符串的属性。这是由此产生的错误:System.InvalidOperationException:Couldnottranslateexpression'Table(Entity).SelectMany(ent=>ent.Telephones.DefaultIfEmpty(),(ent,tel)=>newf__AnonymousType0`2(Name=ent.FormattedName,Tel=IIF((tel!=null),tel.FormattedNumber,"")))'到SQL中,无法将其视为本地表达式。如果我将上面的引用从FormattedNumber更改为纯数字,一切正常。但我确实希望格式化的数字能够很好地显示在我的列表中。你推荐什么作为最干净、最干净的方式?您可以在实体上使用AsEnumerable,但这会强制它恢复所有列(即使未使用);也许改为:varq1=fromentinLinqUtils.GetTable()fromtelinent.Telephones.DefaultIfEmpty()selectnew{Name=ent.FormattedName,Number=(tel==null?null:ent.Number),Extension=(tel==null?null:ent.Extension)};varq2=fromrowinq1.AsEnumerable()selectnew{row.Name,FormattedNumber=FormatNumber(row.Number,row.Extension)};其中FormatNumber是一种获取并合并它们的方法,可能会从您的其他(属性)代码中重复使用。使用LINQ-to-SQL,另一种选择是在数据库中进行格式化的数据上下文中公开一个UDF;一个稍微不同的例子:varqry=fromcustinctx.Customers//andtelselectnew{cust.Name,FormattedNumber=ctx.FormatNumber(tel.Number,tel.Extension)};(这将在数据库中完成工作;这是个好主意吗;-p)干净的方法是在表达式中声明您真正需要的字段,将它们放在中间层对象中,并使用任何辅助函数来修改他们。我不确定您是否意识到代表LINQ的SQL表的类是一个DTO类——它定义了LINQ-SQL转换器使用的语法。甚至不支持将属性注入未映射到SQL表的DTO-这意味着可以随意触发转换器。属性定义语法,表达式转换器没有任何未定义的语法。from子句中命名的实体不是对象-它们只是用于帮助拼写将获取的实际表字段的符号。选择中未明确命名的字段是未提取的字段——至少这是翻译器的目标,它可能不得不让一些漏掉。例如,如果ent.FormattedName没有声明,那就是一个破坏后者的错误。因此注入到DTO类中的FormattedNumber属性在语法中甚至不存在。它不是“计算字段”——该术语严格用于SQL表定义,如果有的话,它将在DTO的语法中。请注意,该错误非常准确地表示“本机表达式”-范围非常有限。您可以尝试使用嵌套的lambda表达式来欺骗它,该表达式在整个“tel”上调用静态函数,这可能会导致获取整个记录-或引发另一个异常。其他LINQ-s,不是翻译器,可以放宽规则。LINQ-SQL要么非常严格要么非常慢,而且已经够慢了:-)@MarcGravell打败了我的回答,也感谢这个问题上的各种回答者让我走上了正确的轨道。我做的很像Mark的第一个建议,像这样:varq2=fromqinq1.AsEnumerable()selectnew{Name=q.ent.FormattedName,Tel=q.tel!=null?q.tel.FormattedNumber:""};就是这样!谢谢大家!以上是C#学习教程:Linq《无法将表达式转换为SQL,也无法将其视为本地表达式》。分享的所有内容,如果对大家有用,需要进一步了解C#学习教程,希望大家多多多多关照——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: