LINQ TO ENTITY cannot compare to enumeration types

4

Below are the enum Leaves

public enum Leaves
{
    Annual = 0,
    Medical = 1,
    Hospitalization = 2,
    Unpaid = 3
}

Below is the linq query

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

I have even try using the Leaves.Annual but it doesnt work. LINQ QUERY THROWS FOLLOWING EXCEPTION :

System.NotSupportedException HResult=0x80131515 Message=Unable to create a constant value of type 'System.Object'. Only primitive types or enumeration types are supported in this context.

c#
asp.net-mvc
entity-framework
enums
linq-to-entities
asked on Stack Overflow May 27, 2018 by loli pop

2 Answers

2

Equals is not supported in Linq2ToEntity you should use the double equal instead:

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

Assuming that your Profileid is a int using the == should make it work without changing the logic or running into case issues.

answered on Stack Overflow May 27, 2018 by Stefan Kert
1

The problem is not relevant with Enum type. You can't use Equals for Linq to entities. So, modify your query;

var lb = (from t in db.LeaveBalance
          select t)
          .Where(t => t.LeaveType == leavesType && t.Profileid == id)
          .FirstOrDefault();
answered on Stack Overflow May 27, 2018 by lucky

User contributions licensed under CC BY-SA 3.0