我正在获取一个字符串数组,我想看看域对象中的一定数量的数据字段是否具有所有这些字符串。我在编译时知道数据字段,但我不知道编译时数组的大小。
有没有办法可以在运行时编写where子句,以便我可以在单个linq查询中执行我正在寻找的内容。
如果你想知道为什么它是一个单一的查询:我想尽可能减少到DB的往返。
public IEnumerable<domainObjects> GetObjectsWith(string[] data)
{
var results = from d in domainObjects
where
(d.Data.Contains(data[0]) && d.Data.Contains(data[1]) && ...)
||
(d.Data2.Contains(data[0]) && d.Data.Contains(data[1]) && ...)
.
.
. // Data fields known at compile-time
}
最终结果是,给定2个对象:
domainObject { Address = "1st st", Description="has couch and bed" }
domainObject2 { Address = "1st rd", Description="has couch" }
{ "couch", "bed" }
的查询只返回domainobject 1,但{ "couch" }
的查询会返回两者。
Likeqise { "1st", "couch", "bed" }
的查询也将同时返回。
答案 0 :(得分:2)
你应该使用PredicateBuilder,它是一个免费的实用程序类,允许你在运行时使用And和Or来构造复杂的where子句。您可以循环遍历数组并以此方式构建where子句。
答案 1 :(得分:2)
有三种主要方法,PredicateBuilder,Dynamic Linq库,或操纵你自己的表达式树(前两个帮助你做的事情)。
如果您事先知道所有属性,那么PredicateBuilder是您最好的选择。如果它们是动态的(即用户选择它们,那么Dynamic Linq是最好的选择)。另见Is there a pattern using Linq to dynamically create a filter?。
答案 2 :(得分:1)
参见SO问题 - &gt; How do you add dynamic 'where' clauses to a linq query?