假设我想要重构以下两个Linq查询:
var someValue1 = 0;
var someValue2= 0;
var query1 = db.TableAs.Where( a => a.TableBs.Count() > someValue1 )
.Take( 10 );
var query2 = db.TableAs.Where( a => a.TableBs.First().item1 == someValue2)
.Take( 10 );
请注意,只有Where参数更改。有什么方法可以将查询放在方法中并将Where参数作为参数传递?
答案 0 :(得分:2)
有。 where参数只是类型Func<T, bool>
的简单闭包(其中T是数据库项的类型 - 我不知道它们的代码),你可以将它包装成(匿名)函数。 / p>
Func<Func<T, bool>, IEnumerable<T>> MakeQuery = (Func<T, bool> whereParam) => db.TableAs.Where(whereParam).Take(10);
像这样使用
var query1 = MakeQuery(a => a.TableBS.Count() > someValue1);
答案 1 :(得分:2)
您可以使用Predicate<T>
。
public IQueryable<TableA> Helper(Predicate<TableA> predicate)
{
return db.TableAs.Where(predicate).Take(10);
}
就这样称呼它。
var query1 = Helper(a => a.TableBs.Count() > someValue1);
var query2 = Helper(a => a.TableBs.First().item1 == someValue2);
并提供比Helper
更好的名字。
答案 2 :(得分:1)
是的,参数类型是lambda表达式Func<TSource, bool>
Func<Person, bool> c1 = p => p.LastName == "1";
Persons.Where(c1);
Func<Person, bool> c2 = p => p.FirstName == "2";
Persons.Where(c2)
答案 3 :(得分:1)
你可以像重构任何其他代码那样做:
T MyQuery(U db, Func<TSource, bool> pred) {
return db.TableAs.Where( pred )
.Take( 10 );
}
其中T和U是您查询中相关的任何类型。