gpt4 book ai didi

asp.net - LINQ - 'Could not translate expression' 以及以前使用过且经过验证的查询条件

转载 作者:行者123 更新时间:2023-12-02 15:47:49 28 4
gpt4 key购买 nike

我对 LINQ 相当陌生,无法理解一些行为不一致的情况。任何有见识的意见将不胜感激。我在 SO 和其他地方看到类似的问题,但它们似乎没有帮助。

我有一个非常简单的设置 - 一个公司表和一个地址表。每个公司可以有 0 个或多个地址,如果 > 0 个,则必须指定一个作为主要地址。我正在尝试使用外部联接并相应地更改 select 语句来处理有 0 个地址的情况。

请注意,我目前将输出直接绑定(bind)到 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}, {1}, {2} {3} ({4})", addr.Address1, addr.City, addr.Region, addr.PostalCode, addr.Country))

现在我收到了无法翻译表达式错误,并且错误中出现了一堆自动生成的代码,这对我来说意义不大。

我添加到 MainAddress 的条件与 AddressID 上的工作条件没有什么不同,所以有人可以告诉我这里发生了什么吗?

非常感谢任何帮助。

最佳答案

您收到的错误告诉您 LinqToSql 无法将您的 null 检查和 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 字段,您可以看到它使用 CASE-WHEN 来处理 AddressID 为 null 时的条件。当您为 MainAddress 添加 CASE-WHEN 时,它会尝试对该字段执行相同的操作,但没有与 string.Format 等效的 SQL code> 它可以用于 ELSE 子句,因此它会爆炸。

解决这个问题的一个简单方法是使用一种方法来格式化字符串。通过调用私有(private)方法,LinqToSql 不会尝试将 string.Format 转换为 SQL,而是返回填充 Address 对象所需的所有字段。然后该方法可以处理格式化。

例如:

LINQ:

....
select new {
comp.CompanyID,
comp.Name,
AddressID = (addr.AddressID == null ? -1 : addr.AddressID),
MainAddress = FormatAddress(addr)
};

方法:

private static string FormatAddress(Address addr)
{
return (addr == null ? "" :
string.Format("{0}, {1}, {2} {3} ({4})",
addr.Address1, addr.City,
addr.Region, addr.PostalCode, addr.Country));
}

关于asp.net - LINQ - 'Could not translate expression' 以及以前使用过且经过验证的查询条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8275687/

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