我需要为我正在处理的一个项目编写一些动态查询。我发现我的程序在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)));
}发布于 2010-03-28 08:36:06
在执行查询时,您应该只使用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();因此,我认为没有必要为动态linq使用“单一”运算符。特别是,因为查询枚举返回的IEnumerable或IQueryable应该只包含一项。
发布于 2010-03-28 11:45:25
我不明白你填写的Single(SingleOrDefault)和First(FirstOrDefault)之间的区别是什么?此外,EF不实现第一个,您必须使用第一个(FirstOrDefault)来代替。还有,为什么你要通过创建你自己的single实现来提高性能呢?你的评论几乎是where的一个副本,几乎和first一样,所以为什么不使用它,并尝试查看生成的查询并分析它们呢?
发布于 2010-03-28 09:10:19
我想Queryable.Single就是你要找的人。
https://stackoverflow.com/questions/2531445
复制相似问题