LINQ是否可以动态添加where子句
我想用不同的密钥搜索我的数据库。 根据输入,10键可能有1个键。 有没有办法动态地向我的Linq查询添加OR / AND子句?
keys[k] // I have my keys in this array var feedList = (from feed in ctx.Feed where feed.content.contains(keys[0]) && feed.content.contains(keys[1]) && ... // continues with the keys.length select new { FeedId = feed.DuyuruId, FeedTitle = feed.FeedTitle, FeedContent = feed.FeedContents, FeedAuthor = user.UserName + " " +User.UserSurname }
您可以尝试.All
子句来检查所有键:
where keys.All(key => feed.content.contains(key))
对于AND子句来说很简单:
var feedList = from feed in ctx.Feed; foreach(var key in keys){ feedList = feedList.Where(x=> content.contains(key)); } var resultQuery = feedList.Select(x=> new {....});
对于OR,您需要使用Expressions
或尝试LinqKit及其谓词:
var predicate = PredicateBuilder.False(); foreach(var key in keys){ predicate = predicate.Or(x=> content.contains(key)); } var resultQuery = ctx.Feed.Where(predicate).Select(x=> new {....});
您可以使用LINQ的扩展方法
ctx.Feed.Where(f => { //Your logic here if(something != null){ return f.Property == something } }).Select( new { FeedId = feed.DuyuruId, FeedTitle = feed.FeedTitle, FeedContent = feed.FeedContents, FeedAuthor = user.UserName + " " +User.UserSurname })
你可以做这样的事情。 记住它可能会产生一些开销
var students = ctx.Students; if (!String.IsNullOrWhiteSpace(SearchParams.Name)) students = from s in students where s.Name.StartsWith(SearchParams.Name) if (!String.IsNullOrWhiteSpace(SearchParams.Surname)) students = from s in students where s.Surname.StartsWith(SearchParams.Surname)
我想提供一个例子,说明@mellamokb的答案如何适用于我的场景,可能帮助任何需要相当动态的linq
查询的人。
在我的示例中,我简单地对datatable
类进行了扩展,因此我可以检查数据库中是否存在数据行,因此不会抛出SQL
主键exception。
/// /// /// /// /// Columns to check in affected table. /// Values to check in affected column. /// public static bool TableContains(this DataTable DT, string[] ColumnNames, object[] ItemtoChecks) { var result = from row in DT.AsEnumerable() where ColumnNames.All( r => row.Field
此方法允许您根据需要向string[]
添加任意数量的列名以及相应的值,以检查单独的object[]
。 查询检查数据表,如果找到匹配,则该方法返回true
,否则返回false
。