使用存储在会话中的 Guid 过滤 Linq
Filter Linq with Guid Stored in Session
我正在使用此代码过滤 Linq 数据,但它一直崩溃。
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);
}
我得到的错误是:
An exception of type 'System.NotSupportedException' occurred in
EntityFramework.SqlServer.dll but was not handled in user code
我知道的错误是在这一行:
.Where(t => t.OpenUserId == Guid.Parse(Session["LogedUserID"] as string))
因为在本例中 Guid 被硬编码时它正在工作:
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);
}
您收到此错误是因为 Linq 代码在 SQL 中进行了转换。在 SQL 中,方法 Guid.Parse
不存在。
在您使用 Where(t.OpenUserId == new Guid("00000000-0000-0000-0000-000000000000"))
的示例中,您没有解析任何内容(调用任何方法),您只是创建了一个受支持的新 Guid
。
一种方法是 Parse
Where
之外的 Guid
。
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 提到的,这将枚举整个 table,不推荐用于大 tables。
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();
请试试这个,应该有用
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();
我正在使用此代码过滤 Linq 数据,但它一直崩溃。
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);
}
我得到的错误是:
An exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll but was not handled in user code
我知道的错误是在这一行:
.Where(t => t.OpenUserId == Guid.Parse(Session["LogedUserID"] as string))
因为在本例中 Guid 被硬编码时它正在工作:
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);
}
您收到此错误是因为 Linq 代码在 SQL 中进行了转换。在 SQL 中,方法 Guid.Parse
不存在。
在您使用 Where(t.OpenUserId == new Guid("00000000-0000-0000-0000-000000000000"))
的示例中,您没有解析任何内容(调用任何方法),您只是创建了一个受支持的新 Guid
。
一种方法是 Parse
Where
之外的 Guid
。
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 提到的,这将枚举整个 table,不推荐用于大 tables。
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();
请试试这个,应该有用
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();