I have an enum type called StatusTypes
public enum StatusTypes
{
Open = 1,
Allocated = 2,
WorkInProgress = 3,
WaitingOnRequestor = 4,
WaitingOnThirdParty = 5,
Monitoring = 6,
Testing = 7,
OnHold = 8,
Complete = 9,
SignedOff = 10,
Reopened = 11
}
I'm trying to use this in my repository....
public IQueryable<Incident> GetAllOutstandingIncidents()
{
return from i in db.Incidents
where i.Status != Types.StatusTypes.SignedOff && i.Status != Types.StatusTypes.Complete && i.DeletedDateTime != null
orderby i.DueDateTime
select i;
}
...and then use it in my view...
<tbody>
<% foreach (var incident in Model.TotalIncidentsOutstandingList) { %>
<tr>
<td><%: incident.IncidentID %></td>
<td><%: incident.Caller.NetworkName %></td>
<td><%: incident.Title %></td>
<td><%: incident.Service.Title %> / <%: incident.Category.Title %> <% if (incident.Subcategory != null) { %> / <%: incident.Subcategory.Title %><% } %></td>
<td><%: incident.Priority %></td>
<td></td>
<td><%: incident.AllocatedTo %></td>
<td><%: incident.DueDateTime %></td>
</tr>
<% } %>
</tbody>
... but I'm getting the error "The specified type member 'Status' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."
Any help gratefully received!
UPDATE TO SHOW incident.cs
public class Incident
{
public int IncidentID { get; set; }
public DomainUser Caller { get; set; }
[Display(Name = "Caller Type")]
public Types.CallerTypes CallerType { get; set; }
public Service Service { get; set; }
public Category Category { get; set; }
public Subcategory Subcategory { get; set; }
public string Title { get; set; }
[Display(Name = "Problem Description")]
public string ProblemDescription { get; set; }
public Equipment Equipment { get; set; }
public Types.ImpactTypes Impact { get; set; }
public Types.UrgencyTypes Urgency { get; set; }
[Display(Name = "Priority")]
public Types.PriorityTypes Priority { get; set; }
[Display(Name="Estimated time for completion")]
public DateTime? DueDateTime { get; set; }
[Display(Name="Date/Time")]
public DateTime? CreatedDateTime { get; set; }
public DomainUser CreatedBy { get; set; }
[Display(Name = "Allocated To")]
public HelpDeskMember AllocatedTo { get; set; }
public DateTime? AllocatedDateTime { get; set; }
public DateTime? ClosedDateTime { get; set; }
public int? ClosedBy { get; set; }
public DateTime? ReopenedDateTime { get; set; }
public int? ReopenedBy { get; set; }
public DateTime? DeletedDateTime { get; set; }
public HelpDeskMember DeletedBy { get; set; }
public Decimal? EstimatedInternalCost { get; set; }
public Decimal? EstimatedResources { get; set; }
public Decimal? RealInternalCost { get; set; }
public Decimal? EstimatedExternalCost { get; set; }
public Decimal? RealExternalCost { get; set; }
public Decimal? EstimatedTotalCost { get; set; }
public Decimal? RealTotalCost { get; set; }
public string CostCode { get; set; }
public string TimeRequired { get; set; }
public string ActualTimeTaken { get; set; }
public Types.StatusTypes Status { get; set; }
public string Solution { get; set; }
public bool UserSignedOff { get; set; }
public bool OverdueEmailSent { get; set; }
public bool EscalatedEmailSent { get; set; }
public ICollection<Note> Notes { get; set; }
public ICollection<Attachment> Attachments { get; set; }
public ICollection<HistoryItem> History { get; set; }
public Incident()
{
Notes = new List<Note>();
Attachments = new List<Attachment>();
History = new List<HistoryItem>();
}
}
As I've already said try to cast both part to the int
type
public IQueryable<Incident> GetAllOutstandingIncidents()
{
return from i in db.Incidents
where (int)i.Status != (int)Types.StatusTypes.SignedOff
&& (int)i.Status != (int)Types.StatusTypes.Complete
&& i.DeletedDateTime != null
orderby i.DueDateTime
select i;
}
UPDATE
That's a feature of Code First. You should do following. Change your class so:
[Column("Status", TypeName = "int")]
public int InternalStatus { get; set; }
public StatusTypes Status { get; set; }
And use following query:
context.Incidents.Where(i => i.InternalStatus == (int)StatusTypes.Allocated);
I've found this info here
You can also convert to LINQ To Object with .AsEnumerable():
public IQueryable<Incident> GetAllOutstandingIncidents()
{
return from i in db.Incidents.AsEnumerable()
where i.Status != Types.StatusTypes.SignedOff && i.Status != Types.StatusTypes.Complete && i.DeletedDateTime != null
orderby i.DueDateTime
select i;
}
Depending of what you want, it could be a not so good solution: Instead of just pulling one object from the database, it will pull all objects when you call .AsEnumerable().
Try this instead
return from i in db.Incidents
where i.Status != (int)Types.StatusTypes.SignedOff && i.Status != (int)Types.StatusTypes.Complete && i.DeletedDateTime != null
orderby i.DueDateTime
select i;
In your Incident class:
private int statusId;
public Types.StatusTypes Status
{
get
{
return (Types.StatusTypes)statusId;
}
set
{
statusId = (int)value;
}
}
public Int StatusId
{
get
{
return statusId;
}
}
Then in you method:
public IQueryable<Incident> GetAllOutstandingIncidents()
{
int signedOffStatusType = (int)Types.StatusTypes.SignedOff;
int completeStatusType = (int)Types.StatusTypes.Complete;
return from i in db.Incidents
where i.StatusId != signedOffStatusType
&& i.StatusId != completeStatusType
&& i.DeletedDateTime != null
orderby i.DueDateTime
select i;
}
Or using method syntax:
public IQueryable<Incident> GetAllOutstandingIncidents()
{
int signedOffStatusType = (int)Types.StatusTypes.SignedOff;
int completeStatusType = (int)Types.StatusTypes.Complete;
return db.Incidents.Where(i => i.StatusId != signedOffStatusType
&& i.StatusId != completeStatusType
&& i.DeletedDateTime != null)
.OrderBy(i => i.DueDateTime);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With