C# LINQ TO实体无法与枚举类型进行比较

C# LINQ TO实体无法与枚举类型进行比较,c#,asp.net-mvc,entity-framework,enums,linq-to-entities,C#,Asp.net Mvc,Entity Framework,Enums,Linq To Entities,下面是枚举叶 public enum Leaves { Annual = 0, Medical = 1, Hospitalization = 2, Unpaid = 3 } 下面是linq查询 public ActionResult ApproveLeave(int? id) { if (id == null) return View(); LeaveApplication leaveApplic

下面是枚举叶

public enum Leaves
{
    Annual = 0,
    Medical = 1,
    Hospitalization = 2,
    Unpaid = 3
}
下面是linq查询

public ActionResult ApproveLeave(int? id)
    {
        if (id == null)
            return View();

        LeaveApplication leaveApplication = db.LeaveApplication.Find(id);

        if (leaveApplication == null)
            return HttpNotFound();

        leaveApplication.Status = "Approved";

        if (ModelState.IsValid)
        {
            db.Entry(leaveApplication).State = EntityState.Modified;

            Leaves leavesType = (Leaves)Enum.Parse(typeof(Leaves), leaveApplication.LeaveType.ToString());

            var lb = (from t in db.LeaveBalance
                      select t)
                      .Where(t => t.LeaveType == leavesType && t.Profileid.Equals(id))
                      .FirstOrDefault();

            lb.Taken++;
            lb.Balance--;
            db.SaveChanges();

            return RedirectToAction("Index");
        }

        return View();
    }
我甚至试过用树叶,但没用。 LINQ查询引发以下异常:

System.NotSupportedException HResult=0x8013155消息=无法创建“System.Object”类型的常量值。在此上下文中仅支持基元类型或枚举类型


Equals
在Linq2ToEntity中不受支持。您应该使用双相等:

var lb = (from t in db.LeaveBalance select t)
  .Where(t => t.LeaveType == leavesType && t.Profileid == id)
  .FirstOrDefault();

假设您的Profileid是一个int,那么使用==应该可以使它在不改变逻辑或遇到case问题的情况下工作。

该问题与
Enum
类型无关。不能对Linq to实体使用
Equals
。因此,修改您的查询

var lb = (from t in db.LeaveBalance
          select t)
          .Where(t => t.LeaveType == leavesType && t.Profileid == id)
          .FirstOrDefault();

作为旁注,您的
if(ModelState.IsValid)
是无意义的-方法中唯一的参数是
int?
因此
ModelState
不会无效。IsValid基于我传入的方法的参数?它不支持等于,我以前使用Equals的代码正在运行,在比较字符串类型值时效果更好。顺便说一句,我解决了它,我才意识到我的Profileid是一个字符串类型,这就是为什么它总是抛出异常。您的评论“假设我的Profileid是int”提醒我检查它。谢谢你的帮助。@C#
中的lolipop等于
=
对于
字符串
和大多数其他类型都是一样的。最大的区别是,如果类型不匹配(我想如果使用
==
,您会得到更好的错误消息)。同样对于Linq到SQL,它也只是被转换成SQL。