我有一個字串串列,我想使用這些字串在物體框架中創建 where 陳述句。例如,如果我有一個字串串列。
List<string> cars = = new(){"car1","car2", "car3"};
我想從串列中動態構建一個 where 子句
query = query.Where(a => a.car == "car1" || a.car == "car2" || a.car == "car3");
uj5u.com熱心網友回復:
使用LINQKit,您可以創建一些擴展方法來自動處理此問題:
// searchTerms - IEnumerable<TSearch> where one must match for a row
// testFne(row,searchTerm) - test one of searchTerms against a row
// dbq.Where(r => searchTerms.Any(s => testFne(r,s)))
public static IQueryable<T> WhereAny<T, TSearch>(this IQueryable<T> dbq, IEnumerable<TSearch> searchTerms, Expression<Func<T, TSearch, bool>> testFne) =>
dbq.AsExpandable().Where(searchTerms.AnyIs(testFne));
public static IQueryable<T> WhereAny<T, TSearch>(this IQueryable<T> dbq, Expression<Func<T, TSearch, bool>> testFne, IEnumerable<TSearch> searchTerms) =>
dbq.AsExpandable().Where(searchTerms.AnyIs(testFne));
public static IQueryable<T> WhereAny<T, TSearch>(this IQueryable<T> dbq, Expression<Func<T, TSearch, bool>> testFne, params TSearch[] searchTerms) =>
dbq.AsExpandable().Where(searchTerms.AnyIs(testFne));
// searchTerms - IEnumerable<TSearch> where one must match for a row
// testFne(row,searchTerm) - test one of searchTerms against a row
// r => searchTerms.All(s => testFne(r,s))
public static Expression<Func<T, bool>> AnyIs<T, TSearch>(this IEnumerable<TSearch> searchTerms, Expression<Func<T, TSearch, bool>> testFne) {
var pred = PredicateBuilder.New<T>();
foreach (var s in searchTerms)
pred = pred.Or(r => testFne.Invoke(r, s));
return pred;
}
然后你可以這樣做:
query = query.WhereAny(cars,(a, c) => a.car == c);
您還可以滾動您自己的簡化 LINQKit 光照環境來處理運算式構造。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/426624.html
下一篇:C#物體框架。簡化查詢
