使用Guid存储在会话中过滤Linq

时间:2015-06-02 16:58:58

标签: c# asp.net-mvc linq guid

我正在使用此代码过滤Linq数据并且它一直在崩溃。

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

我得到的错误是:

  

类型' System.NotSupportedException'的例外情况发生在   EntityFramework.SqlServer.dll但未在用户代码中处理

我知道的错误就在这一行:

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

因为Guid在这种情况下是硬编码的,所以它正在工作:

{{1}}

2 个答案:

答案 0 :(得分:4)

您收到此错误,因为Linq代码在SQL中转换。在SQL中,方法Guid.Parse不存在。

在您的Where(t.OpenUserId == new Guid("00000000-0000-0000-0000-000000000000")) 示例中,您没有解析任何内容(调用任何方法),您只需创建一个受支持的新Guid

一种方法是Parse Guid 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()

另一种解决此问题的简单方法是添加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(); 。正如@entropic所提到的,这将枚举整个表格,不推荐用于大型表格。

NLS_DATE_FORMAT

答案 1 :(得分: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();