asp.net – LINQ – ‘无法翻译表达式’与以前使用和验证的查询
我是LINQ的新手,无法解决一些行为上的不一致问题.任何知识渊博的输入将非常感激.我在SO和其他地方看到类似的问题,但它们似乎没有帮助.
我有一个非常简单的设置 – 公司表和地址表.每个公司可以有0个或更多地址,如果> 0必须指定一个作为主地址.我正在尝试处理有0个地址的情况,使用外连接并相应地更改select语句. 请注意我目前正在将输出绑定到GridView,所以我想在查询中保留所有处理. 以下内容有效 IQueryable query = from comp in context.Companies join addr in context.Addresses on comp.CompanyID equals addr.CompanyID into outer // outer join companies to addresses table to include companies with no address from addr in outer.DefaultIfEmpty() where (addr.IsMain == null ? true : addr.IsMain) == true // if a company has no address ensure it is not ruled out by the IsMain condition - default to true if null select new { comp.CompanyID,comp.Name,AddressID = (addr.AddressID == null ? -1 : addr.AddressID),// use -1 to represent a company that has no addresses MainAddress = String.Format("{0},{1},{2} {3} ({4})",addr.Address1,addr.City,addr.Region,addr.PostalCode,addr.Country) }; 但是这会在GridView中显示一个空地址为“,()” 所以我更新了MainAddress字段 MainAddress = (addr.AddressID == null ? "" : String.Format("{0},addr.Country)) 现在我得到了无法翻译表达式错误和错误中的一堆spewey自动生成的代码,这对我来说意义不大. 我添加到MainAddress的条件与AddressID上的工作条件没有什么不同,所以有人能告诉我这里发生了什么吗? 任何帮助非常感谢. 解决方法
您得到的错误告诉您LinqToSql无法将您的空检查转换为String.Format表达式转换为SQL.如果你查看第一个查询生成的SQL(使用LinqPad或SQL Profiler),你会看到类似的东西:
SELECT [t0].[CompanyID],[t0].[Name],(CASE WHEN [t1].[AddressID] IS NULL THEN @p0 ELSE [t1].[AddressID] END) AS [AddressID],[t1].[Address1] AS [value],[t1].[City] AS [value2],[t1].[Region] AS [value3],[t1].[PostalCode] AS [value4],[t1].[Country] AS [value5] FROM [Company] AS [t0] LEFT OUTER JOIN [Address] AS [t1] ON [t0].[CompanyID] = [t1].[CompanyID] WHERE ([t1].[IsMain] IS NULL) OR ([t1].[IsMain] = 1) 对于AddressID字段,您可以看到它在AddressID为null时使用CASE-WHEN来处理条件.当你为MainAddress添加一个CASE-WHEN时,它试图对该字段做同样的事情,但没有SQL等效于它可以用于ELSE子句的string.Format,所以它会爆炸. 解决此问题的一种简单方法是使用方法格式化字符串.通过调用私有方法,LinqToSql不会尝试将string.Format转换为SQL,而是返回填充Address对象所需的所有字段.然后该方法可以处理格式化. 例如: LINQ: .... select new { comp.CompanyID,MainAddress = FormatAddress(addr) }; 方法: private static string FormatAddress(Address addr) { return (addr == null ? "" : string.Format("{0},addr.Country)); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何阻止.Net HttpWebRequest.GetResponse()引发异常
- asp.net – WebForms中的异步/等待 – 在页面生命周期结束之
- asp.net-2.0 – 如何解决ASP.NET“?”应用程序路径到网站根
- asp.net – DropDownList的SelectedIndexChanged()如何在没
- 会话处理在asp.net
- asp.net-membership – MiniProfiler和SqlMembershipProvid
- asp.net – 是否有可能检测到移动浏览器的GPS位置?
- ASP.NET Web Api在返回404时返回200 OK
- asp.net-mvc – ASP.NET MVC WebApi:没有为此对象定义的无
- asp.net-mvc – 使用ASP.NET Identity 2.0 UserManagerFact