2014-12-07 2 views
1

В моей C# linq-Querys я часто использую выражение как (правило, в моем приложении):другой термин для Linq-Где

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

Могу ли я написать это в CustomExpression как:

.MyIdCheck() 

Or есть ли лучший способ, чтобы инкапсулировать правило?

+1

'.гд (х => новые [] { 1, 12, 16}. Состояния (x)) '. А ** HashSet ** для 'new [] {1, 12, 16}' будет еще лучше. –

+1

Ответ в значительной степени зависит от типа LINQ, с которым вы имеете дело. Бэкэнд SQL делает его совершенно другим. –

ответ

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(); 

Другой подход было бы определить массив, который содержит идентификаторами вы ищете, как показано ниже:

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

Тогда ваш чек он будет, как показано ниже:

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

Вам понадобится 'where T: SomeTypeWhichHasId' ограничение – CRice

+0

@CRice, по этой причине я упомянул вместо 'T', мы поместим тип, который OP должен выполнить проверку. Если существует много типов, которые имеют свойство Id и мы хотим точно такую ​​же логику, тогда мы должны установить это дополнительное ограничение. – Christos

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

Вы можете сделать лямбда-выражения для повторного использования, делая названный метод из него:

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

Теперь вы можете использовать имя метода, где вы бы использовать лямбда-выражение:

.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); 
Смежные вопросы