加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

.net – LINQ中的动态where子句 – 在运行时可以使用列名

发布时间:2020-12-12 08:49:58 所属栏目:MsSql教程 来源:网络整理
导读:免责声明:我已经使用System. Linq.Expressions中的表达式解决了问题,但我仍然在寻找更好/更简单的方法. 考虑以下情况: var query = from c in db.Customers where (c.ContactFirstName.Contains("BlackListed") || c.ContactLastName.Contains("BlackListed
免责声明:我已经使用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);

我已经用它来构建LINQ来搜索大约20个不同的选项,并且它产生了非常好的SQL.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读