Re: [LINQ] Можно ли построить запрос?
От: HowardLovekraft  
Дата: 08.10.10 10:23
Оценка:
Здравствуйте, 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, рекурсию и пр. добавить/выбросить по вкусу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.