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。