2013-06-14 15 views
9

Mam trudności z wpisaniem zapytania linq, które sprawdzi, czy kolejne cyfry w liczbie całkowitej są zawarte w kluczu podstawowym tabeli. Załóżmy, że istnieje tabela o nazwie Employees z kluczem podstawowym na kolumnie Employees.Id. Załóżmy, że klucz podstawowy jest typu danych serwera SQL INT. Chciałbym napisać kwerendy LINQ przy użyciu Entity Framework kod najpierw, że zwróci wszystkich pracowników, których podstawowy klucz zawiera ciąg 456. coś takiego:Integer Zawiera używanie Linq

string filter = "456"; 

var results = from e in myDbContext.Employees 
    where e.Id.Contains(filter) 
    select e; 

Problem polega na tym, że zawiera metoda nie jest przeznaczona do typów danych w całkowitych C# ...

+1

FYI string.Contains() nie jest metoda rozszerzenie, ale jest regularny sposób na obiektach smyczkowych. – recursive

+0

@recursive: Dzięki, edytowałem pytanie, aby uwzględnić Twoją poprawkę. – Andrew

+1

Mimo że X.L.Ant zaproponował rozwiązanie, możesz rozważyć zmianę typu danych swojej kolumny na "char" lub "varchar". Celem typu numerycznego jest przechowywanie i przetwarzanie * wielkości * wartości, dlatego typ 'int' ma wbudowane funkcje, takie jak" większy niż "i" mniejszy niż ". Jeśli poszczególne symbole w twoim ID mają rzeczywiste znaczenie, to to, co przechowujesz, jest po prostu * kodem *, który używa symboli numerycznych, ale nie przedstawia wielkości. – JDB

Odpowiedz

20

Spróbuj:

var results = from e in myDbContext.Employees 
    where SqlFunctions.StringConvert((double)e.Id).Contains(filter) 
    select e; 
+0

Czy na pewno wywołanie 'ToString()' zostanie przetłumaczone na SQL? –

+0

Otrzymuję komunikat o błędzie "Linq to Entities nie rozpoznaje metody metody" System.String ToString() ", a tej metody nie można przetłumaczyć na wyrażenie w magazynie." – Andrew

+0

@Andrew Edytowane, to powinno działać lepiej. –

2

można konwertować zarówno do łańcucha, a następnie wykonaj zapytanie. W twoim przypadku:

string filter = "456"; var results = from e in myDbContext.Employees where e.Id.ToString().Contains(filter) select e;

+1

Czy 'ToString()' zgłasza wyjątek typu 'NotSupportedException'? – sepehr