Mam takie zapytanie
(from u in DataContext.Users
where u.Division == strUserDiv
&& u.Age > 18
&& u.Height > strHeightinFeet
select new DTO_UserMaster
{
Prop1 = u.Name,
}).ToList();
Chcę dodać różne warunki, takie jak wiek, wzrost na podstawie tego, czy te warunki zostały dostarczone do metody uruchamiającej to zapytanie. Wszystkie warunki będą obejmować podział użytkowników. Jeśli podano wiek, chcę to dodać do zapytania. Podobnie, jeśli podano wysokość, chcę to również dodać.
Gdyby to miało być zrobione za pomocą zapytań sql, użyłbym konstruktora ciągów, aby dodać je do głównego zapytania strSQL. Ale tutaj w Linq mogę myśleć tylko o zastosowaniu warunku IF, w którym napiszę to samo zapytanie trzykrotnie, z każdym blokiem IF zawierającym dodatkowy warunek. Czy jest lepszy sposób na zrobienie tego?
źródło
LINQ to Entities does not recognize the method 'System.String get_Item(System.String)' method, and this method cannot be translated into a store expression.
Zwykle używam łączenia metod, ale mam ten sam problem. A oto rozszerzenie, którego używam
Pomaga uniknąć zerwania łańcucha. Te same
ConditionalOrderBy
iConditionalOrderByDescending
są pomocne.źródło
jedna opcja.
lub możesz przełączyć się na składnię metody dla linq i użyć warunków if, aby dołączyć wyrażenia do klauzuli where.
źródło
Po prostu używam go w mojej klauzuli Where as
źródło
Na podstawie określonego warunku dodaj warunek gdzie ...
źródło
Oto mój kod, aby zrobić podobną rzecz. Jest to metoda w moim interfejsie API usługi sieci Web WCF SOAP.
Podstawowe zapytanie
Select(f => f)
oznacza w zasadzie WSZYSTKO, aWhere
klauzule są do niego opcjonalnie dołączone. FinałSelect
jest opcjonalny. Używam do konwersji obiektów wierszy bazy danych na obiekty wynikowe „Owoce”.źródło
Zakładając następujący parametr,
Po prostu używając
&&
i||
operatorów warunkowych możemy mieć inną wersję.Podobnie jak Param1, możesz dodać dowolną liczbę parametrów warunku wyszukiwania.
źródło
Właśnie natknąłem się na to, szukając czegoś innego, ale pomyślałem, że wrzucę wersję lambda.
Najpierw utworzyłbym taką klasę, aby przekazywała parametry do warstwy danych:
Następnie w mojej warstwie danych coś takiego:
To, gdzie zmaterializujesz zapytanie, zależy od Ciebie. Może istnieć warstwa między aplikacją a danymi, która konwertuje reprezentacje specyficzne dla db na db-agnostic (być może wykonujesz zapytania z wielu źródeł danych). Ta warstwa może pobierać wiele typów zapytań z tych źródeł i na przykład mapować je do wspólnej reprezentacji POCO.
źródło
Aby dodać do powyższej akceptowanej odpowiedzi tutaj , jeśli wykonujesz dynamiczne wyszukiwanie na złączeniu, rozważ zwrócenie nowego obiektu z obiema tabelami (t1, t2) w początkowym zapytaniu linq, abyś mógł uzyskać do nich dostęp indywidualnie, aby wykonać warunkowe Szukaj.
Otrzymałem odpowiedź, której szukałem tutaj, w odniesieniu do łączenia dwóch tabel i odpytywania określonych kolumn w którejkolwiek z tabel
źródło