2011-12-28 18 views
5

Chcę zamówić przez moje wyniki z liczbą meczów w mojej linii ciągu.Podziel ciąg z LINQ

Więc tutaj jest kod

.ThenByDescending(p => p.Title.ToLower() 
           .Split(' ') 
           .Count(w => words.Any(w.Contains))); 

Ale to przyniesie mi błąd i mówi, że LINQ nie można analizować Split do SQL.

LINQ jednostki nie zna metody „system.string [] podziału (Char [])”, metoda i sposób ten nie może być tłumaczony na ekspresję przechowywania.

Jak mogę zaimplementować Split za pośrednictwem LINQ?

Na przykład dla tej tablicy musi zamówić w ten sposób

words = { "a", "ab" } 

ab a ggaaag gh //3 matches 
ba ab ggt //2 matches 
dd //0 matches 

Odpowiedz

8

to znaczy, że LINQ do podmiotów nie udało się znaleźć tłumaczenie Splitu metody, która może być zapisana jako zapytania SQL. jeśli chcesz wykonywać funkcje podzielone trzeba wnieść zapis w pamięci wywołując ToList(), AsEnumerable() itp

var result = (from t in db.Table 
       select t).AsEnumerable().OrderBy(x=>x.Column).ThenByDescending(p=>p.Title.ToLower.Split(' ')....); 
+0

Ale to spowoduje załadowanie wszystkich danych w pamięci i wykonanie LINQ do transformacji obiektów przeciwko niemu, prawda? – abatishchev

+0

Tak, to prawda. Optymalnie możesz zastosować warunki w klauzuli where przed wywołaniem 'AsEnumerable'. nie możesz tego zrobić bez przyprowadzania obiektów do pamięci. –

+0

Domyślam się, że zawiesi się z dużymi tabelami. Zgadzam się z abatishchev. –

2

Trzeba będzie wykonać sortowania w LINQ to Objects ponieważ LINQ podmiotom nie można przetłumaczyć kod C# pod SQL (lub język dowolnego DB, którego używasz).

Możesz to zrobić tak.

var results = 
    objectContext 
    .Where(a => a == b) //Whatever 
    .AsEnumerable() 
    .ThenByDescending(p=>p.Title.ToLower().Split(' ').Count(w=>words.Any(w.Contains))); 

AsEnumerable() (wraz z ToArray() lub ToList()) obracają LINQ do podmiotów z powrotem do LINQ obiektów.

2

Nie można oczekiwać, że LINQ do Entities będzie w stanie przekonwertować to na SQL.

Najlepszym rozwiązaniem jest zmiana schematu, tak aby każde słowo w tytule wpisu było przechowywane jako osobny wiersz w oddzielnej tabeli (z odpowiednimi skojarzeniami). Zapytanie może następnie użyć jawnych (grupowych) operacji łączenia lub właściwości powiązania FK.

Jeśli nie możesz tego zrobić, a chcesz, aby zapytanie zostało uruchomione w bazie danych, musisz zajrzeć do pisania funkcji zdefiniowanej przez użytkownika, aby pracować z rozdzielonymi ciągami. Przeczytaj this question, aby uzyskać więcej informacji. Będzie to jednak dużo pracy.

Najprostszym rozwiązaniem (jeśli możesz sobie na to pozwolić) jest oczywiście wyciągnięcie wszystkiego z powrotem do klienta, po prostu użyj LINQ do obiektów dla tej części zapytania, jak wspomniał @Muhammad Adeel Zahid.