自定义扩展,功能实现在C#(LINQ-2-实体)
问题描述:
例如, “IN”:自定义扩展,功能实现在C#(LINQ-2-实体)
。载有(...)的supporten在Linq2Entities并转化为 “IN” 的SQL表达式。
我婉重写此查询:
var foundExntities = myDbContext.MyEntityes.Where(o => new List<int> {111, 222, 333).Contains(o.ID)).ToList()
在形式上像有:
var foundExntities = myDbContext.MyEntityes.Where(o => o.ID.In(111, 222, 33)).ToList()
我怎么能写correspondend定制在(...)分机功能?
答
我该如何编写通信和自定义在(...)扩展函数中?
你不能没有也写它通过识别您的自定义扩展方法,并相应地转换他们(类似LINQKitAsExpandable()
实现)的表达式树转换一个完全成熟的查询提供。
你能虽然做的是创建一个自定义IQueryable<T>
扩展方法与限制,它只能与LINQ方法语法和只用根可查询的运营商所使用的:这是适用于你的样品
public static partial class QueryableExtensions
{
public static IQueryable<T> WhereIn<T, V>(this IQueryable<T> source, Expression<Func<T, V>> valueSelector, params V[] values)
{
var condition = Expression.Call(
typeof(Enumerable), "Contains", new[] { typeof(V) },
Expression.Constant(values), valueSelector.Body);
var predicate = Expression.Lambda<Func<T, bool>>(condition, valueSelector.Parameters);
return source.Where(predicate);
}
}
作为:
var foundEntities = myDbContext.MyEntityes.WhereIn(o => o.ID, 111, 222, 33).ToList();
+0
感谢很多伊凡! –
我建议你不要。在'int'上定义扩展方法是非常令人困惑的,当这些方法泄漏到不能使用的上下文中(并且写入它们以便它们可以在任何地方使用似乎都不值得)。除此之外,我不认为你可以* - 方法需要被EF表达式树解析器识别,我不认为它们有扩展点。 (虽然我对EF本身并不熟悉,但我确信你可以包装'IQueryable'实现,但即使这样做似乎比它的价值更麻烦。 –
尽管可以使用'params int []'声明可变数量的整数参数(请参阅https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/linq/how-to -add-custom-methods-for-linq-queries),我反对在EF中创建自定义聚合方法。由于自定义方法有时不直接转换为SQL查询,因此可能会引发诸如“LINQ to Entities does not recognized the method”之类的问题。 –
我只想提取**以EF(LINQ-2-SQL)表达式**为这种宏函数而闻名。这个函数只会扩展我的查询树。 –