2015-06-02 16 views
3

我正在使用此代碼來過濾Linq數據,並且它不斷崩潰。過濾Linq與Guid存儲在會話中

public ActionResult Index() 
{ 

    var model = db.Tickets 
      .Include(t => t.TicketNotes) 
      .Where(t => t.OpenUserId == Guid.Parse(Session["LogedUserID"] as string)) 
      .OrderBy(t => t.OpenDate) 
      .ToList(); 

    return View(model); 
} 

我得到的錯誤是:

'System.NotSupportedException' 類型發生在 EntityFramework.SqlServer.dll但在用戶代碼中沒有處理的例外

的我知道的錯誤是在這條線上:

.Where(t => t.OpenUserId == Guid.Parse(Session["LogedUserID"] as string)) 
public ActionResult Index() 
{ 

    var model = db.Tickets 
        .Include(t=>t.TicketNotes) 
        .Where(t.OpenUserId == new Guid("00000000-0000-0000-0000-000000000000")) 
        .OrderBy(t=>t.OpenDate); 

    return View(model); 
} 

回答

4

因爲Linq的代碼在SQL轉換你得到這個錯誤:210,因爲當的GUID硬編碼在這種情況下,這是工作。在SQL中,方法Guid.Parse不存在。

Where(t.OpenUserId == new Guid("00000000-0000-0000-0000-000000000000"))你沒有任何解析(調用任何方法)的例子,你只是創建它支持的新Guid

方法將ParseGuid以外Where

var userId = Guid.Parse(Session["LogedUserID"] as string); // conversion is done outside Where 
var model = db.Tickets 
     .Include(t => t.TicketNotes) 
     .Where(t => t.OpenUserId == userId) 
     .OrderBy(t => t.OpenDate) 
     .ToList(); 

解決此問題的另一個簡單方法是加入ToList()。正如@entropic所提到的,這將在整個表格中列舉出來,不建議用於大型表格。

var model = db.Tickets 
     .Include(t => t.TicketNotes) 
     .ToList() // < added here 
     .Where(t => t.OpenUserId == Guid.Parse(Session["LogedUserID"] as string)) 
     .OrderBy(t => t.OpenDate) 
     .ToList(); 
+1

絕對的,這就是爲什麼轉換需要LINQ表達式之前完成。 – Yuri

+1

添加'.ToList()'將列舉整個表......如果它變得很大,這可能是最糟糕的事情。你的第二個例子更好...但它仍然在整個表上調用'.ToList()'... – entropic

+0

@entropic感謝您突出顯示這一點,我在我的答案上添加了。在第二個例子中是複製粘貼錯誤(它不應該調用'.ToList()')非常感謝你發現這一點。 – adricadar

4

請試試這個,應該工作

Guid g = Guid.Parse(Session["LogedUserID"] as string); 

var model = db.Tickets 
       .Include(t => t.TicketNotes) 
       .Where(t => t.OpenUserId == g) 
       .OrderBy(t => t.OpenDate) 
       .ToList();