我需要为我正在处理的项目编写一些动态查询。我发现我的程序在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)));
}
答案 0 :(得分: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();
所以,我没有看到动态linq的“单一”运算符的必要性。特别是,由于查询枚举返回的IEnumerable
或IQueryable
应该只包含一个项目。
答案 1 :(得分:1)
我不明白你在Single(SingleOrDefault)和First(FirstOrDefault)之间的区别是什么? 此外EF不实现第一个,你必须使用First(FirstOrDefault)。 另外你为什么填写你将通过创建你自己的单一实现来获得性能提升,这是你的评论几乎是一个地方的副本,这几乎与第一个相同 那么为什么不使用它,并尝试查看生成的查询并分析它们?
答案 2 :(得分:0)
我认为Queryable.Single
正是您所寻找的。 p>