Здравствуйте, skodnik, Вы писали:
S>Можно ли такое только LINQ построить?
Что такое "Только LINQ"? Можно динамически формировать выражение для поиска.
Примерно так:
static Expression CallContains(ParameterExpression entityParameter, String tag)
{
var containsMethod = typeof(String).GetMethod("Contains", new Type[] { typeof(String) });
return Expression.Call(Expression.Property(entityParameter, "Tags"), containsMethod, Expression.Constant(tag));
}
static Expression BuidBody(ParameterExpression entityParameter, Queue<String> tags)
{
var currentTag = tags.Dequeue();
return tags.Count == 0 ?
CallContains(entityParameter, currentTag) :
Expression.Or(CallContains(entityParameter, currentTag), BuidBody(entityParameter, tags));
}
static void Main(string[] args)
{
using (var context = new ObjectContext(...))
{
var tags = new Queue<String>();
tags.Enqueue("black");
tags.Enqueue("white");
tags.Enqueue("yellow");
var entityParameter = Expression.Parameter(typeof(MyEntity), "e");
var body = BuidBody(entityParameter, tags);
var lambda = Expression.Lambda<Func<MyEntity, Boolean>>(body, entityParameter);
foreach (var entity in context.MyEntities.Where(lambda))
{
Console.WriteLine(entity.Tags);
}
}
}
Набросано на скорую руку. Проверки, Queue вместо List, рекурсию и пр. добавить/выбросить по вкусу.