2010-03-28 1 views
1

Мне нужно написать динамические запросы для проекта, над которым я работаю. Я выясняю, что значительная часть времени тратится на мою программу на методах Count и First, поэтому я начал меняться. Единственный, только чтобы узнать, что такого метода нет.Как я могу расширить DynamicQuery.cs для реализации единого метода?

Код, приведенный ниже, был моей первой попыткой создать один (в основном, скопированный из метода Where), но он не работает. Помогите?

public static object Single(this IQueryable source, string predicate, params object[] values) 
    { 
     if (source == null) throw new ArgumentNullException("source"); 
     if (predicate == null) throw new ArgumentNullException("predicate"); 
     LambdaExpression lambda = DynamicExpression.ParseLambda(source.ElementType, typeof(bool), predicate, values); 
     return source.Provider.CreateQuery(
      Expression.Call(
       typeof(Queryable), "Single", 
       new Type[] { source.ElementType }, 
       source.Expression, Expression.Quote(lambda))); 
    } 
+0

Можете ли вы описать, как он не работает? – Gabe

ответ

1

ИМХО, вы должны просто можете использовать Single или SingleOrDefault, когда вы выполняете запрос.

// build your dynamic query 
var query = NorthwindConext.Products.Categories 
            .Where("CategoryID = @0", 2); 
// now you can simply get the single item by 
var category = query.SingleOrDefault(); 

Итак, я не вижу необходимости для оператора «Single» для динамического linq. Особенно, поскольку IEnumerable или IQueryable, возвращенные перечислением запросов, должны содержать только один элемент.

+0

Queryable.Single не будет работать из коробки b/c Мне нужен динамический запрос, в котором выражение лямбда построено как строка, затем анализируется. – Yoenhofen

0

Я думаю, что Queryable.Single - это то, что вы ищете.

+0

Queryable.Single не будет работать из коробки b/c Мне нужен динамический запрос, в котором выражение лямбда построено как строка, затем анализируется. – Yoenhofen

+0

Просто поместите лямбда в 'Where' и передайте результат этого в' Queryable.Single'. Он будет делать то же самое. – Gabe

1

Я не понимаю, в чем разница, которую вы заполняете, между Одиночным (SingleOrDefault) и First (FirstOrDefault)? Кроме того, EF не реализует первый, и вместо этого вы должны использовать First (FirstOrDefault). Также, почему вы заполняете, вы получите улучшение производительности, создав собственную реализацию сингла, которая по вашему комментарию почти копирует, где почти то же самое, что и первое , поэтому почему бы не использовать его и попытаться посмотреть запрос генерируется и анализируется?

Смежные вопросы