免责声明:我已经使用System.Linq.Expressions中的Expressions解决了该问题,但我仍在寻找一种更好/更简便的方法。
考虑以下情况:
var query =
from c in db.Customers
where (c.ContactFirstName.Contains("BlackListed") ||
c.ContactLastName.Contains("BlackListed") ||
c.Address.Contains("BlackListed"))
select c;
仅在运行时对我可用的需要对照黑名单术语进行检查的列/属性。如何生成此动态where子句?
另一个复杂之处在于,将Queryable集合(上面的db.Customers)键入为“Customer”(例如“Person”)基类的Queryable,因此,如上所述不能编写c.Address。
最佳答案
@Geoff最好的选择是动态LINQ。
如果您想使用Lambda在运行时构建查询的方式,尽管我建议您使用PredicateBuilder(http://www.albahari.com/nutshell/predicatebuilder.aspx)并具有以下内容:
Expression<Fun<T,bool>> pred = null; //delcare the predicate to start with. Note - I don't know your type so I just used T
if(blacklistFirstName){
pred = p => p.ContactFirstName.Contains("Blacklisted");
}
if(blacklistLastName){
if(pred == null){
pred = p => p.ContactLastName.Contains("Blacklisted"); //if it doesn't exist just assign it
}else{
pred = pred.And(p => p.ContactLastName.Contains("Blacklisted"); //otherwise we add it as an And clause
}
}
对于要包括的所有列,依此类推。当您查询查询时,您只需要以下内容:
var results = db.Customers.Where(pred).Select(c => c);
我用它来构建LINQ,以搜索大约20种不同的选项,并且它产生了非常好的SQL。
关于.net - LINQ中的动态where子句-在运行时具有列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/234439/