1

我需要为我正在处理的项目编写一些动态查询。我发现我的程序在 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)));
    }
4

3 回答 3

1

我不明白您填写 Single(SingleOrDefault) 和 First(FirstOrDefault) 之间的区别是什么?此外,EF 没有实现第一个,您必须改用 First(FirstOrDefault)。另外,为什么要填写,您将通过创建自己的 single 实现来提高性能,这是通过您的评论几乎是 where 的副本,这与第一个几乎相同,所以为什么不使用它,并尝试查看查询的存在生成并分析它们?

于 2010-03-28T03:45:24.990 回答
1

恕我直言,您应该只是可以使用SingleSingleOrDefault在执行查询时使用。

// 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();

因此,我认为动态 linq 没有必要使用“单一”运算符。特别是,查询枚举返回的IEnumerableorIQueryable应该只包含一项。

于 2010-03-28T00:36:06.223 回答
0

我想Queryable.Single这就是你要找的。

于 2010-03-28T01:10:19.353 回答