Entity Framework - Linq to Entities - 可选过滤器
Entity Framework - Linq to Entities - Optional filter
我正在努力弄清楚如何让 LINQ 语句在 单个 语句中的 SQL 中生成特定的 WHERE
子句。
我正在制作这样的东西:
SELECT ColA, ColB, ColC, ColN...
FROM Orders
WHERE Client = @ClientId
AND (@CompanyId IS NULL OR @CompanyId = CompanyId)
我的(失败)LINQ 语句如下所示:
var includeAllCompanies = company == null;
var data = context.Orders.Where(o => o.Client.Id == clientId
&& (includeAllCompanies
|| (c.Company != null && c.Company.Id == company.Id)).ToList();
但是,当变量 company
为 NULL 时,它总是抛出异常(它在初始化后工作正常)。例外情况是:
Non-static method requires a target.
我目前的解决方法是将我的 LINQ 语句一分为二。一个使用 Expression<Func<>>
(将转换为带有部分过滤的 SQL 语句)。然后另一个使用 Func<>
对返回的列表执行剩余的过滤器。
Expression<Func<>>
让 SQL 完成一些工作(不包括可为 null 的对象)
var data = context.Orders.Where(o => o.Client.Id == clientId).ToList();
Func<>
然后过滤掉可为 null 的对象
data = data.Where(c => (territory == null
|| (c.Territory != null && c.Territory.Id == territory.Id))).ToList();
这有效,但是,我希望 SQL 执行此查询。
问题在于,company
是服务器端变量。关于 includeAllCompanies
值,EF 必须将整个 LINQ 查询转换为 SQL - 在这种情况下 SQL 不知道什么是 company.Id
- 所以 EF 必须始终得到 company.Id
值以便放入 SQL 查询。即使 company
为空(所以这就是你得到异常的原因)。我希望你明白我的意思,如果没有 - 我会尝试提供一些示例。
为了摆脱异常,您可以执行以下操作:
var companyId = company == null ? null : (int?)company.Id;
var data = context.Orders.Where(o => o.Client.Id == clientId
&& (companyId == null
|| (c.Company != null && c.Company.Id == companyId)).ToList();
我正在努力弄清楚如何让 LINQ 语句在 单个 语句中的 SQL 中生成特定的 WHERE
子句。
我正在制作这样的东西:
SELECT ColA, ColB, ColC, ColN...
FROM Orders
WHERE Client = @ClientId
AND (@CompanyId IS NULL OR @CompanyId = CompanyId)
我的(失败)LINQ 语句如下所示:
var includeAllCompanies = company == null;
var data = context.Orders.Where(o => o.Client.Id == clientId
&& (includeAllCompanies
|| (c.Company != null && c.Company.Id == company.Id)).ToList();
但是,当变量 company
为 NULL 时,它总是抛出异常(它在初始化后工作正常)。例外情况是:
Non-static method requires a target.
我目前的解决方法是将我的 LINQ 语句一分为二。一个使用 Expression<Func<>>
(将转换为带有部分过滤的 SQL 语句)。然后另一个使用 Func<>
对返回的列表执行剩余的过滤器。
Expression<Func<>>
让 SQL 完成一些工作(不包括可为 null 的对象)
var data = context.Orders.Where(o => o.Client.Id == clientId).ToList();
Func<>
然后过滤掉可为 null 的对象
data = data.Where(c => (territory == null
|| (c.Territory != null && c.Territory.Id == territory.Id))).ToList();
这有效,但是,我希望 SQL 执行此查询。
问题在于,company
是服务器端变量。关于 includeAllCompanies
值,EF 必须将整个 LINQ 查询转换为 SQL - 在这种情况下 SQL 不知道什么是 company.Id
- 所以 EF 必须始终得到 company.Id
值以便放入 SQL 查询。即使 company
为空(所以这就是你得到异常的原因)。我希望你明白我的意思,如果没有 - 我会尝试提供一些示例。
为了摆脱异常,您可以执行以下操作:
var companyId = company == null ? null : (int?)company.Id;
var data = context.Orders.Where(o => o.Client.Id == clientId
&& (companyId == null
|| (c.Company != null && c.Company.Id == companyId)).ToList();