2010-01-11 3 views
1

У меня есть следующий код теста поиска общего списка:IList - LINQ для фильтрации и заказа по

public void DoSearch(string searchTerm) 
{ 

IList<MyEntity> entities = GetCollectionOfEntities(); 

IList<MyEntity> results = entities.Where(d => d.Description.Contains(searchTerm)).ToList(); 

} 

Я хочу, чтобы передать заказ по параметру (который был бы свойством MyEntity) и, конечно, закажите мои результаты на основе этого. Я понимаю, что LINQ использует OrderBy, но не понимает, как упорядочить свойство MyEntity.

ответ

9

Вы просто использовать Func<TSource,TKey> указать свойство, которое вы хотите заказать по:

DoSearch("foo", e => e.SomeProperty); 

// ... 

public void DoSearch<TKey>(string searchTerm, Func<MyEntity, TKey> orderBy) 
{ 
    IList<MyEntity> entities = GetCollectionOfEntities(); 

    IList<MyEntity> results = entities 
           .Where(e => e.Description.Contains(searchTerm)) 
           .OrderBy(orderBy) 
           .ToList(); 

    // etc 
} 
+0

Хорошо, это хороший старт, но как бы я пропустил это как параметр, чтобы моя подпись метода была общедоступной. DoSearch (string searchTerm, orderby) ...? – youwhut

+0

Ни в коем случае, ни в использовании Reflection (что медленно и, вероятно, вообще не полезно). Способ Func <> - это действительно лучший способ пойти сюда imo. +1 –

+0

Отлично. Приветствия за помощь. – youwhut

0
public void DoSearch(string searchTerm, Func<MyEntity, PropertyType> selector) 
    { 

     IList<MyEntity> entities = GetCollectionOfEntities(); 

     IList<MyEntity> results = entities 
         .Where(d => d.Description.Contains(searchTerm)) 
         .OrderBy(selector) 
         .ToList(); 

    } 

    DoSearch("searchTerm", entity => entity.Property) 

PropertyType является тип недвижимости, которую хотите отсортировать. Иначе вы могли бы сделать это Общее:

public void DoSearch<TKey>(string searchTerm, Func<MyEntity, Tkey> selector) 

И назовите его.