2014-12-07 72 views
1

在我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

回答

2

你可以聲明一個擴展方法類型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

0

您可以使用一種方法:

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

// ... 

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

你可以做這樣的事情:

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

然後使用包含列表功能。

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

您可以通過一個名爲方法出它使lambda表達式可重複使用:

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

現在你可以使用方法名,你會使用lambda表達式:

.Where(MyIdCheck) 
0

您可以創建一個自定義的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);