使用存储在会话中的 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();