如何扩展DynamicQuery.cs以实现.Single方法?

时间:2010-03-28 00:18:49

标签: c# asp.net linq-to-sql dynamicquery

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

答案 0 :(得分: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的“单一”运算符的必要性。特别是,由于查询枚举返回的IEnumerableIQueryable应该只包含一个项目。

答案 1 :(得分:1)

我不明白你在Single(SingleOrDefault)和First(FirstOrDefault)之间的区别是什么? 此外EF不实现第一个,你必须使用First(FirstOrDefault)。 另外你为什么填写你将通过创建你自己的单一实现来获得性能提升,这是你的评论几乎是一个地方的副本,这几乎与第一个相同 那么为什么不使用它,并尝试查看生成的查询并分析它们?

答案 2 :(得分:0)

我认为Queryable.Single正是您所寻找的。