免责声明:我已经使用System.
Linq.Expressions中的表达式解决了问题,但我仍然在寻找更好/更简单的方法.
考虑以下情况:
var query = from c in db.Customers where (c.ContactFirstName.Contains("BlackListed") || c.ContactLastName.Contains("BlackListed") || c.Address.Contains("BlackListed")) select c;
需要根据黑名单进行检查的列/属性仅在运行时可用于我.如何生成这个动态的where子句?
另外一个复杂的问题是,可查询的集合(上面的db.Customers)被输入到“Customer”的基类的Queryable(比如’Person’),因此,如上所述编写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);
原文地址:https://www.jb51.cc/mssql/75254.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。