2012-04-14 12 views
9

Jak mogę rozwiązać ten problem?LINQ to Entities nie rozpoznaje metody "System.String get_Item (System.String)",

Oto mój kod:

DateTime dtInicio = new DateTime(); 
    DateTime dtFim = new DateTime(); 
    Int32 codStatus = 0; 

    if(!string.IsNullOrEmpty(collection["txtDtInicial"])) 
     dtInicio = Convert.ToDateTime(collection["txtDtInicial"]); 
    if(!string.IsNullOrEmpty(collection["txtDtFinal"])) 
     dtFim = Convert.ToDateTime(collection["txtDtFinal"]); 
    if (!string.IsNullOrEmpty(collection["StatusCliente"])) 
     Convert.ToInt32(collection["StatusCliente"]); 

    var listCLientResult = (from c in db.tbClientes 
          orderby c.id 
          where (c.effdt >= dtInicio || string.IsNullOrEmpty(collection["txtDtInicial"]) && 
           (c.effdt <= dtFim || string.IsNullOrEmpty(collection["txtDtFinal"])) && 
           (c.cod_status_viagem == codStatus || string.IsNullOrEmpty(collection["StatusCliente"]))) 
           select c); 
    return View(listCLientResult); 

Błąd otrzymuję to:

LINQ do podmiotów nie rozpoznaje metoda 'system.string get_Item (System.String)', który nie może zostać przekonwertowane na wyrażenie repozytorium.

+0

proszę przyjrzeć się tej odpowiedzi: http://stackoverflow.com/questions/7259567/linq-to-entities-does-not-recognize-the-method Pozdrowienia – MUG4N

+0

Tak, przyjrzeć zalecanej pytanie, które odpowiada dlaczego masz błąd i http://stackoverflow.com/a/5541505/1109444 powie Ci, jak zbudować kwerendę pracy. – Hari

+0

możliwe duplikat [LINQ podmioty nie rozpoznaje metoda "system.string ToString()] (metoda http://stackoverflow.com/questions/4121863/linq-to-entities-does-not-recognize-the- metoda-system-string-toString-method) –

Odpowiedz

28

Zapytania Linq wykonywane względem bazy danych są tłumaczone na SQL, zanim zostaną wykonane; ale collection["txtDtInicial"] nie można przetłumaczyć na SQL, ponieważ nie ma równoważnej składni SQL, a zresztą baza danych nie ma dostępu do collection. Najpierw musisz wyodrębnić collection["txtDtInicial"] do zmiennej i użyć tylko tej zmiennej w zapytaniu.

Oto co zrobię:

DateTime dtInicio = DateTime.MinValue; 
DateTime dtFim = DateTime.MaxValue; 
Int32 codStatus = 0; 

if(!string.IsNullOrEmpty(collection["txtDtInicial"])) 
    dtInicio = Convert.ToDateTime(collection["txtDtInicial"]); 
if(!string.IsNullOrEmpty(collection["txtDtFinal"])) 
    dtFim = Convert.ToDateTime(collection["txtDtFinal"]); 
if (!string.IsNullOrEmpty(collection["StatusCliente"])) 
    codStatus = Convert.ToInt32(collection["StatusCliente"]); 

var listCLientResult = (from c in db.tbClientes 
         orderby c.id 
         where (c.effdt >= dtInicio) && 
          (c.effdt <= dtFim) && 
          (c.cod_status_viagem == codStatus) 
          select c); 
return View(listCLientResult); 

inicjując dtInicio i dtFim do MINVALUE i MAXVALUE, nie trzeba by sprawdzić, czy są one określone w zapytaniu.

+3

Trzeba zapytać, dlaczego LINQ nie jest mądrzejszy niż to? – PeterX

+2

@PeterX, cóż, Linq jest już całkiem sprytnym IMO ... –

+0

To był mój problem –

5

Zapytanie Linq ostatecznie przekształca się w zapytanie SQL, a LINQ nie wie, co zrobić z sesją ["UserName"] (która otrzymuje element "UserName").

Częstym sposobem na obejście tego jest po prostu użyć zmiennej lokalnej do której możesz przypisać Session [ „username”] i że będziesz używać w zapytaniu Linq ...

jak

string loggedUserName = Session ["LogedUsername"]. ToString();
var userdetail = dc.faculties.Where (A => a.F_UserName.Equals (loggedUserName)) FirstOrDefault (.);

odniesienia http://mvc4asp.blogspot.in/

Powiązane problemy