2010-10-19 5 views
9

Mam więc model stworzony w Entity Framework 4 przy użyciu pierwszych funkcji kodu CTP4. To wszystko działa dobrze razem.Kod źródłowy Entity First i kryteria wyszukiwania

Próbuję dodać funkcję wyszukiwania zaawansowanego do mojej aplikacji. Ta funkcja "wyszukiwania zaawansowanego" pozwala użytkownikom na wprowadzanie wielu kryteriów wyszukiwania. Na przykład: szukaj

zaawansowany produkt

  • Nazwa
  • Data rozpoczęcia
  • Data Zakończenia

Pozwoliłoby to użytkownikowi wyszukiwać według nazwy produktu, a także ograniczyć wyniki według dat, w których zostały utworzone.

Problem polega na tym, że nie wiem, ile z tych pól zostanie wykorzystanych w jednym wyszukiwaniu. W jaki sposób można skonstruować moje zapytanie Entity Framework?

Mam an example opisujące, jak utworzyć dynamiczne zapytanie dla Entity Framework, jednak nie wydaje się to działać dla klas POCO, które stworzyłem dla trwałości Code First.

Jaki jest najlepszy sposób na skonstruowanie zapytania, gdy liczba ograniczeń jest nieznana?

Odpowiedz

20

Po kilku godzinach pracy nad tym problemem (i pewną pomocą od naszego przyjaciela, Google'a) znalazłem możliwe do rozwiązania rozwiązanie mojego problemu. I stworzył następujące Linq rozszerzenie wyrażenie:

using System; 
using System.Linq; 
using System.Linq.Expressions; 

namespace MyCompany.MyApplication 
{ 
    public static class LinqExtensions 
    { 
     public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Expression<Func<TSource, bool>> predicate) 
     { 
      if (condition) 
       return source.Where(predicate); 
      else 
       return source; 
     } 
    } 
} 

To rozszerzenie pozwala na kwerendy LINQ być utworzony tak:

var products = context.Products.WhereIf(!String.IsNullOrEmpty(name), p => p.Name == name) 
           .WhereIf(startDate != null, p => p.CreatedDate >= startDate) 
           .WhereIf(endDate != null, p => p.CreatedDate <= endDate); 

Dzięki temu każdy rachunek WhereIf aby oddziaływał tylko na wyniki, jeżeli spełnia ona dostarczona stan. Rozwiązanie wydaje się działać, ale zawsze jestem otwarty na nowe pomysły i/lub konstruktywną krytykę.

+0

Genialny! Dzięki! –

+0

+1 Bardzo przydatne trochę kodu. –

+0

możemy użyć in-buil gdzie(). Gdzie(), ale dlaczego ktoś powinien używać twojego rozszerzenia? co jest takiego wyjątkowego? –

0

John,

Twoje rozwiązanie jest absolutnie niesamowite! Ale, aby się podzielić, używam tej metody powyżej, dopóki nie zobaczę twojej ideii.

var items = context.Items.Where(t => t.Title.Contains(keyword) && !String.IsNullOrEmpty(keyword)); 

Nie wydaje się, że jest to najlepsze rozwiązanie, ale na pewno jest do zrobienia.