2017-07-17 102 views
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定制在(...)分机功能?

+3

我建议你不要。在'int'上定义扩展方法是非常令人困惑的,当这些方法泄漏到不能使用的上下文中(并且写入它们以便它们可以在任何地方使用似乎都不值得)。除此之外,我不认为你可以* - 方法需要被EF表达式树解析器识别,我不认为它们有扩展点。 (虽然我对EF本身并不熟悉,但我确信你可以包装'IQueryable'实现,但即使这样做似乎比它的价值更麻烦。 –

+0

尽管可以使用'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”之类的问题。 –

+0

我只想提取**以EF(LINQ-2-SQL)表达式**为这种宏函数而闻名。这个函数只会扩展我的查询树。 –

回答

3

我该如何编写通信和自定义在(...)扩展函数中?

你不能没有也写它通过识别您的自定义扩展方法,并相应地转换他们(类似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

感谢很多伊凡! –