簡體   English   中英

實體框架-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完成某些工作(不包括可為空的對象)

var data = context.Orders.Where(o => o.Client.Id == clientId).ToList();

Func<>然后過濾掉可為空的對象

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為null(這就是為什么您會得到異常)。 希望您能理解我的意思,否則-我會嘗試提供一些示例。

為了擺脫異常,您可以執行以下操作:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM