簡體   English   中英

動態過濾Entity Framework 6中的where子句(不帶LINQKit)

[英]Dynamic filter for where clause in Entity Framework 6 (without LINQKit)

我使用實體框架6,而不使用LINQKit。

假設我們有一個用戶界面,用戶只能按名稱或按姓氏或按名稱和姓氏過濾客戶端(這非常簡化,但描述了我的情況)。

如果我使用靜態過濾器-它可以正常工作:

Expression<Func<Client, Boolean>> staticFilter = (c) => c.Name.Equals(someName) && c.Surname.Equals(someSurname);
var filteredClientsStaticFilter = context.Clients.Where(staticFilter).ToList(); 

但是,如果我嘗試動態創建相同的過濾器:

Expression<Func<Client, Boolean>> nameFilter = (c) => c.Name.Equals(someName);
Expression<Func<Client, Boolean>> surnameFilter = (c) => c.Surname.Equals(someSurname);

var expr = Expression.And(nameFilter.Body, surnameFilter.Body);
var dynamicFilter = Expression.Lambda<Func<Client, Boolean>>(expr, nameFilter.Parameters[0]);
var filteredClientsDynamicFilter = context.Clients.Where(dynamicFilter).ToList();

-失敗,但出現以下異常:

在指定的LINQ to Entities查詢表達式中未綁定參數“ u”

但是我需要動態創建過濾器,因為它取決於用戶選擇的過濾條件。

那么如何正確構建動態過濾器?

兩個表達式的(c)參數不相同,請參見此SO問題的答案。

通過使用表達式庫,可以使表達式使用相同的類型參數。

首先,創建類型參數:

var typeParameter = Expression.Parameter(typeof(Client), "c");

...然后使用聲明的type參數創建相等表達式:

var nameProperty = Expression.Property(typeParameter, nameof(Client.Name));
var nameExpression = Expression.Equal(nameProperty, Expression.Constant(someName));

和:

var surnameProperty = Expression.Property(typeParameter, nameof(Client.Surname));
var surnameExpression = Expression.Equal(surnameProperty, Expression.Constant(someSurname));

然后,您可以使用type參數來創建過濾器並執行查詢:

var expr = Expression.And(nameExpression, surnameExpression);
var dynamicFilter = Expression.Lambda<Func<Client, bool>>(expr, typeParameter);
var filteredClientsDynamicFilter = context.Clients.Where(dynamicFilter).ToList();

暫無
暫無

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

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