.net - LINQ中的动态where子句-在运行时具有列名

标签 .net linq-to-sql dynamic-linq

免责声明:我已经使用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/

相关文章:

.NET - 如何将 "caps"分隔字符串拆分为数组?

c# - 序列化 LinqToSql 生成的实体,保持关系和延迟加载

c# - 动态Linq无法解析long.Parse()

c# - 使用动态 linq 查询聚合函数 Count()

c# - 必须使用完全限定的类名

.net - .NET 是否有时区更改的历史记录?

c# - 如何在 winforms C# 中将数据从一种表单传输到另一种表单?

c# - LINQ to SQL : Invalid column name 'DepartureGate' , 即使该列存在

c# - Linq-to-sql 用户生成的谓词

linq - 如何将 DynamicLinq "contains” 或 “like” 与数字一起使用?