C# 使用实体框架和WebApi计算属性

C# 使用实体框架和WebApi计算属性,c#,entity-framework,asp.net-web-api,entity-framework-6,C#,Entity Framework,Asp.net Web Api,Entity Framework 6,如何正确处理EF模型中的计算属性 由于“无法在LINQ to Entities查询中构造实体或复杂类型‘Invoice’,我的下面的try-bellow将失败。” 将方法“GetInvoice”视为具有允许查询字符串的WebApi方法 static void Main(string[] args) { var invs = GetInvoice(); invs.FirstOrDefault(); } public static IQueryable<I

如何正确处理EF模型中的计算属性

由于“无法在LINQ to Entities查询中构造实体或复杂类型‘Invoice’,我的下面的try-bellow将失败。”

将方法“GetInvoice”视为具有允许查询字符串的WebApi方法

static void Main(string[] args)
{
        var invs = GetInvoice();

        invs.FirstOrDefault();

}

public static IQueryable<Invoice> GetInvoice()
{
        var model = new Model();

        IQueryable<Invoice> inv = model.Invocies.Include(t => t.Items).SelectInvoiceData();
        return inv;
}

public static class ExtHelper
{
    public static IQueryable<Invoice> SelectInvoiceData(this IQueryable<Invoice> item)
    {
        return item.Select(c => new Invoice
        {
            LatestItemName = c.Items.FirstOrDefault().Name
        });
    }
}

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedAt { get; set; }
}

public class Invoice
{
    public int Id { get; set; }
    public DateTime CreatedAt { get; set; }

    public string Issuer { get; set; }

    [NotMapped]
    public string LatestItemName { get; set; }

    private ICollection<Item> _items;
    public virtual ICollection<Item> Items
    {
        get { return _items ?? (_items = new Collection<Item>()); }
        set { _items = value; }
    }

}
static void Main(字符串[]args)
{
var invs=GetInvoice();
invs.FirstOrDefault();
}
公共静态IQueryable GetInvoice()
{
var模型=新模型();
IQueryable inv=model.invoices.Include(t=>t.Items)。选择InvoiceData();
退货库存;
}
公共静态类ExtHelper
{
公共静态IQueryable SelectInvoiceData(此IQueryable项)
{
退货项目。选择(c=>新发票
{
LatestItemName=c.Items.FirstOrDefault().Name
});
}
}
公共类项目
{
公共int Id{get;set;}
公共字符串名称{get;set;}
public DateTime CreatedAt{get;set;}
}
公共类发票
{
公共int Id{get;set;}
public DateTime CreatedAt{get;set;}
公共字符串颁发者{get;set;}
[未映射]
公共字符串LatestItemName{get;set;}
私人ICollection项目;
公共虚拟ICollection项目
{
获取{return\u items???(\u items=new Collection());}
设置{u items=value;}
}
}

EntityFramework 6不支持创建这样的部分实体。或者使用匿名类型:

return item.Select(c => new
{
    LatestItemName = c.Items.FirstOrDefault().Name
});
或不属于上下文的某些DTO类:

return item.Select(c => new InvoiceDTO
{
    LatestItemName = c.Items.FirstOrDefault().Name
});
但是,在EF Core中,可以像您的示例中那样创建实体