2012-04-14 96 views
9

我該如何解決這個問題?LINQ to Entities不能識別方法'System.String get_Item(System.String)',

這裏是我的代碼:

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

我得到的錯誤是:

LINQ到實體無法識別方法 'System.String get_Item(System.String)',哪些不能轉換成存儲庫的表達式。

+0

請看看這個答案: http://stackoverflow.com/questions/7259567/linq-to-entities-does-not-recognize-the-method 問候 – MUG4N 2012-04-14 19:34:59

+0

是的,看看推薦的問題,這就是爲什麼你會得到錯誤,並且http://stackoverflow.com/a/5541505/1109444會告訴你如何構建一個工作查詢。 – Hari 2012-04-14 19:38:36

+0

[LINQ to Entities可能重複無法識別方法'System.String ToString()'方法](http://stackoverflow.com/questions/4121863/linq-to-entities-does-not-recognize-the-方法系統字符串tostring方法) – 2013-12-12 13:32:36

回答

28

對數據庫執行的Linq查詢在執行之前會轉換爲SQL;但collection["txtDtInicial"]不能轉換爲SQL,因爲沒有等效的SQL語法,並且無論如何數據庫無權訪問collection。您需要首先將collection["txtDtInicial"]提取到變量,並在查詢中僅使用此變量。

這裏是我會做:

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

通過初始化dtIniciodtFim到MINVALUE和MaxValue的,你並不需要檢查他們是否在查詢中定義。

+3

人們不得不問,爲什麼LINQ不是比這更聰明? – PeterX 2014-04-08 00:23:22

+2

@PeterX,好吧,Linq已經很漂亮了IMO ... – 2014-04-08 00:26:54

+0

這是我的問題 – 2017-06-21 02:24:08

5

Linq查詢最終轉換爲SQL查詢,而LINQ不知道如何處理Session [「UserName」](即獲取「UserName」項)。

要解決一個常見的方法就是使用一個局部變量,你會指定會話[「用戶名」],並且你會在你的Linq查詢使用...

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

參考http://mvc4asp.blogspot.in/

相關問題