2012-01-12 12 views
8

Używam Entity Framework Code First. Chcę zapytać entites z bazy danych przeciwko obiektów List. Działa to dobrze z zawartością, ale jak mogę połączyć to z StartsWith?Entity Framework 4.1 Linq Zawiera i uruchamia z

To jest mój kod:

List<string> values = new List<string>(); 
values.Add("A"); 
values.Add("B"); 
context.Customer.Where(c => values.Contains(c.Name)).ToList(); 

Jak mogę kwerendy wobec wszystkich klientów, który rozpoczyna się z A lub B?

Odpowiedz

10

to powinno działać w pamięci, ale nie jestem pewien, czy to może być tłumaczone na język SQL przez EF:

context.Customer.Where(c => values.Any(s => c.Name.StartsWith(s))).ToList(); 
+0

fyi aktualizuje się niestety z rdzeniem EF, to jest oceniane lokalnie warn: Microsoft.EntityFrameworkCore.Query [20500 ] Wyrażenie LINQ "gdzie {z tekstu ciągu w __textach_0, gdzie [d] .Entry.StartsWith ([tekst]) wybierz [tekst] => Dowolne()}" nie może być przetłumaczone i będzie oceniane lokalnie. –

+0

@AnthonyJohnston [To może być powiązane] (https://stackoverflow.com/a/44372562/335858) – dasblinkenlight

2

Nie musisz łączyć go z StartsWith, ponieważ jeśli zaczyna się od A lub B, to oczywiście zawiera A lub B. Nie może zaczynać się od A lub B i nie może zawierać A ani B.

Po prostu użyj StartsWith zamiast Contains.

context.Customer.Where(c => c.StartsWith("A") || c.StartsWith("B")).ToList(); 
+0

Nie używam String.Contains(), ale List.Contains(). Twoje rozwiązanie działa, ale nie jest dynamiczne. Na przykład. zapytanie do A-K. – LuckyStrike

+1

@LuckyStrike - sugeruję, że jeśli masz takie wymagania, dołącz je do swojego pytania. W przeciwnym razie marnujesz każdy czas, odrzucając rozwiązania, o których nie mogli wiedzieć, że nie są tym, czego szukałeś. –

0

Mógłbyś spróbować łączenia dwóch funkcji w ten sposób:

IQueryable<Customer> result = (from C in context.Customerwhere C.Name.StartsWith("B") && values.Contains(C.Name)); 
+0

Brakuje spacji z C w 'context.Customerwhere' powinno być z C w' context.Customer gdzie ' –

Powiązane problemy