假设我有一个数组,我想对varchar进行LINQ查询,该查询返回在varchar中任何位置都有数组元素的记录.
像这样的东西会很甜蜜.
string[] industries = { "airline", "railroad" }
var query = from c in contacts where c.industry.LikeAnyElement(industries) select c
string[] industries = { "airline", "railroad" }
var query = from c in contacts where c.industry.LikeAnyElement(industries) select c
string[] industries = { "airline", "railroad" }
var query = from c in contacts where c.industry.LikeAnyElement(industries) select c
有任何想法吗?
这实际上是我在" 快速自己 "演示中使用的一个例子,对于常规LINQ中很难做到的事情; 据我所知,最简单的方法是手动编写谓词.我使用下面的例子(注意它同样适用于StartsWith
等):
using (var ctx = new NorthwindDataContext()) { ctx.Log = Console.Out; var data = ctx.Customers.WhereTrueForAny( s => cust => cust.CompanyName.Contains(s), "a", "de", "s").ToArray(); } // ... public static class QueryableExt { public static IQueryableWhereTrueForAny ( this IQueryable source, Func >> selector, params TValue[] values) { return source.Where(BuildTrueForAny(selector, values)); } public static Expression > BuildTrueForAny ( Func >> selector, params TValue[] values) { if (selector == null) throw new ArgumentNullException("selector"); if (values == null) throw new ArgumentNullException("values"); if (values.Length == 0) return x => true; if (values.Length == 1) return selector(values[0]); var param = Expression.Parameter(typeof(TSource), "x"); Expression body = Expression.Invoke(selector(values[0]), param); for (int i = 1; i < values.Length; i++) { body = Expression.OrElse(body, Expression.Invoke(selector(values[i]), param)); } return Expression.Lambda >(body, param); } }