Как я могу расширить DynamicQuery.cs для реализации метода .Single? - PullRequest
1 голос
/ 28 марта 2010

Мне нужно написать несколько динамических запросов для проекта, над которым я работаю. Я обнаружил, что моя программа тратит значительное количество времени на методы Count и First, поэтому я начал переходить на .Single, только чтобы узнать, что такого метода нет.

Приведенный ниже код был моей первой попыткой создать его (в основном, скопированный из метода 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)));
    }

Ответы [ 3 ]

1 голос
/ 28 марта 2010

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

1 голос
/ 28 марта 2010

ИМХО, вы просто должны использовать 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" для dynnamic linq. В частности, поскольку IEnumerable или IQueryable, возвращаемые перечислением запросов, должны содержать только один элемент.

0 голосов
/ 28 марта 2010

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

...