LINQ to Entities 不支持指定的类型成员

发布于 2024-12-29 06:10:35 字数 4266 浏览 3 评论 0原文

我有一个名为 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
}

我试图在我的存储库中使用它......

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

然后在我的视图中使用它......

<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>

但我收到错误“指定的类型成员' LINQ to Entities 不支持 Status',仅支持初始值设定项、实体成员和实体导航属性。”

任何帮助感激不尽!

更新以显示 event.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>();
    }
}

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

独享拥抱 2025-01-05 06:10:35

正如我已经说过的,尝试将两个部分都转换为 int 类型

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

这是 Code First 的一个功能。你应该做以下事情。更改您的课程:

[Column("Status", TypeName = "int")]
public int InternalStatus { get; set; }
public StatusTypes Status { get; set; }

并使用以下查询:

context.Incidents.Where(i => i.InternalStatus == (int)StatusTypes.Allocated);

我找到了此信息 此处

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

吻安 2025-01-05 06:10:35

您还可以使用 .AsEnumerable() 转换为 LINQ To Object:

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

根据您的需要,这可能是一个不太好的解决方案:当您调用 .AsEnumerable( 时,它不会只从数据库中提取一个对象,而是会提取所有对象)。

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().

多像笑话 2025-01-05 06:10:35

试试这个

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;

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;
凶凌 2025-01-05 06:10:35

在您的事件类中:

private int statusId;
public Types.StatusTypes Status 
{ 
    get 
    {
        return (Types.StatusTypes)statusId;
    }
    set
    {
        statusId = (int)value;
    }
}

public Int StatusId 
{ 
    get 
    {
        return statusId;
    }
}

然后在您的方法中:

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

或使用方法语法:

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

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文