簡體   English   中英

將謂詞組合成表達式

[英]combine predicates into expression

我旨在使用此簽名:

IEnumerable<T> SearchFor(Expression<Func<T, bool>> expression);

並希望將這兩個謂詞與:

Func<Employee, bool> isActiveEmployee = e => e.DateFired == null;
Func<Employee, bool> isNewEmployee = e => e.DateHired >= DateTime.Today.AddDays(-90);

成為表達。 請問我該如何實現?

PS:

基本上,我正在嘗試使用this 但是這行:

var body = (BinaryExpression) expression.Body;

此處獲取的方法GetDynamicQuery中拋出異常:

無法將類型為“ System.Linq.Expressions.InstanceMethodCallExpressionN”的對象轉換為類型為“ System.Linq.Expressions.BinaryExpression”的對象。

使用這種方法:

Expression<Func<Employee, bool>> isActiveEmployee = e => e.DateFired == null;
Expression<Func<Employee, bool>> isNewEmployee = e => e.DateHired >= DateTime.Today.AddDays(-90);

Expression<Func<Employee, bool>> combined_expression = e => isActiveEmployee.Invoke(e) && isNewEmployee.Invoke(e);

我假設您需要一個可以由許多數據訪問框架轉換為SQL的真實表達式。

一種解決方案是像這樣使用LinqKit

Expression<Func<Employee, bool>> isActiveEmployee = e => e.DateFired == null;
Expression<Func<Employee, bool>> isNewEmployee = e => e.DateHired >= DateTime.Today.AddDays(-90);

Expression<Func<Employee, bool>> combined_expression = e => isActiveEmployee.Invoke(e) && isNewEmployee.Invoke(e);

然后,您可以使用AsExpandable方法包裝IQueryable ,如下所示:

var query = context.Employees.AsExpandable().Where(combined_expression);

或者,如果您不想調用AsExpandable ,則可以展開新表達式,然后像其他任何表達式一樣使用它:

Expression<Func<Employee, bool>> combined_expression = e => isActiveEmployee.Invoke(e) && isNewEmployee.Invoke(e);

combined_expression = combined_expression.Expand();

var query = context.Employees.Where(combined_expression);

更新:

對於您提供的第二個示例,可以執行以下操作:

Expression<Func<Employee, bool>> expression1 = e => e.Guid == new Guid("28D3BCFB-9472-4141-BD88-BE5E7E1230F0");

Expression<Func<Employee, bool>> expression2 = e => e.Guid == new Guid("0F0DBA45-F842-4E46-9ED4-F50B5BCF0509");

Expression<Func<Employee, bool>> combined_expression = e => expression1.Invoke(e) || expression2.Invoke(e);

combined_expression = combined_expression.Expand();

// use combined_expression

暫無
暫無

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

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