2012-04-14 21 views
9

Come posso risolvere questo problema?LINQ to Entities non riconosce il metodo 'System.String get_Item (System.String)',

Ecco il mio codice:

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); 

L'errore che sto ottenendo è:

LINQ to Entities non riconosce il metodo 'System.String get_Item (System.String)', che non può essere convertito in un'espressione del repository.

+0

si prega di dare un'occhiata a questa risposta: http://stackoverflow.com/questions/7259567/linq-to-entities-does-not-recognize-the-method Saluti – MUG4N

+0

Sì, dai un'occhiata alla domanda consigliata, che ti spiega perché ricevi l'errore e http://stackoverflow.com/a/5541505/1109444 ti dirà come creare una query di lavoro. – Hari

+0

possibile duplicato di [LINQ su Entità non riconosce il metodo 'System.String ToString()' metodo] (http://stackoverflow.com/questions/4121863/linq-to-entities-does-non-recognize-the- metodo-system-string-tostring-metodo) –

risposta

28

Le query Linq eseguite su un database vengono tradotte in SQL prima che possano essere eseguite; ma collection["txtDtInicial"] non può essere tradotto in SQL, perché non esiste una sintassi SQL equivalente, e comunque il database non ha accesso a collection. È necessario estrarre prima collection["txtDtInicial"] in una variabile e utilizzare solo questa variabile nella query.

Ecco cosa farei:

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); 

Con l'inizializzazione dtInicio e dtFim a MinValue e MaxValue, non è necessario verificare se sono definiti nella query.

+3

Uno deve chiedere perché LINQ non è più intelligente di questo? – PeterX

+2

@PeterX, beh, Linq è già abbastanza intelligente IMO ... –

+0

Questo era il mio problema –

5

La query di Linq viene trasformata in una query SQL e LINQ non sa cosa fare con Session ["UserName"] (che ottiene l'elemento "UserName").

Un modo comune per risolvere questo è solo quello di usare una variabile locale a cui si assegna Session [ "username"] e che userete nella query LINQ ...

come

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

riferimento http://mvc4asp.blogspot.in/

Problemi correlati