其他条款对LINQ,凡

问题描述:

在我C# linq-Querys我经常使用类似(在我的应用程序的规则)的表达式:其他条款对LINQ,凡

.Where(x => x.Id == 1 || x.Id == 12 || x.Id == 16) 

我可以写这篇文章像CustomExpression:

.MyIdCheck() 

或者有没有更好的方法来封装规则?

+1

'。凡(X =>新的[] { 1,12,16} .Contains(x))'。新** [1,12,16]的** HashSet **会更好。 – 2014-12-07 22:25:53

+1

答案很大程度上取决于你正在处理的LINQ类型。一个SQL后端使它完全不同。 – 2014-12-07 22:35:25

你可以声明一个扩展方法类型IEnumrable<T>

public static class MyExtensions 
{ 
    public IEnumerable<T> MyIdCheck(this IEnumerable<T> input) 
    { 
     return input.Where(x => x.Id == 1 || x.Id == 12 || x.Id == 16); 
    } 
} 

在地方的T你必须把你的对象的类型。

然后,您可以在使用Where时使用它。

var result = input.MyIdCheck(); 

另一种方法是将定义一个数组,包含您所寻找的IDS,象下面这样:

var ids = new int[] { 1, 12, 16 }; 

然后你检查它会像下面:

var result = input.Where(x=>ids.Contains(x)); 
+1

你需要'where T:SomeTypeWhichHasId'约束 – CRice 2014-12-07 22:47:00

+0

@CRice,因为这个原因我提到代替'T',我们把OP需要做的检查放在类型上,如果有很多类型有一个Id属性和我们想要完全相同的逻辑,那么我们应该放置这个额外的约束。 – Christos 2014-12-07 22:49:44

您可以使用一种方法:

private bool MyIdCheck(int x) { 
    return x.Id == 1 || x.Id == 12 || x.Id == 16 
} 

// ... 

.Where(x => MyIdCheck(x.Id)); 

你可以做这样的事情:

var acceptableIds = new List<int>() {1, 12, 16}; 

然后使用包含列表功能。

a.Where(x => acceptableIds.Contains(x.Id)) 

您可以通过一个名为方法出它使lambda表达式可重复使用:

public static bool MyIdCheck(MyClass x) { 
    return x.Id == 1 || x.Id == 12 || x.Id == 16; 
} 

现在你可以使用方法名,你会使用lambda表达式:

.Where(MyIdCheck) 

您可以创建一个自定义的Func:

Func<MyClass, bool> MyIdCheck = x => x.Id == 1 || x.Id == 12 || x.Id == 16; 

,并调用它像:

var allMyClass = new List<MyClass>(); 
Console.WriteLine(allMyClass.Where(MyIdCheck)); 

或者添加到您的类:

public static IEnumerable<MyClass> MyIdCheck(IEnumerable<MyClass> myClass) 
{ 
    return myClass.Where(x => x.Id == 1 || x.Id == 12 || x.Id == 16); 
} 

,并调用它像:

MyClass.MyIdCheck(allMyClass);