【问题标题】:Non-Persistence Field非持久性字段
【发布时间】:2019-05-26 11:22:46
【问题描述】:

我有Items 表:

Id Code   Quantity
1  Cake01 10
2  Cake02 15
3  Cake03 20

public class Items
{
    public int Id { get; set; }
    public string Code { get; set; }
    public int Quantity { get; set; }
}

Orders 表:

Id ItemsId Quantity
1  1       5
2  1       3
3  2       10
4  3       2
5  3       5
6  1       2

public class Orders
{
    public int Id { get; set; }
    public int ItemsId { get; set; }
    public virtual Items Items { get; set; }
    public int Quantity { get; set; }
}

如何在 MVC 5 中获得剩余数量?通常,我只是创建这样的视图:

select a.Id, a.Quantity-(isnull(b.Quantity,0)) as Remaining 
from Items a left join
(select ItemsId as Id, sum(Quantity) as Quantity group by ItemsId) as b
on a.Id = b.Id

结果:

Id Remaining
1  1
2  5
3  10

是否可以在 MVC 5 中创建非持久性字段?我对此进行了搜索,但一无所获。

【问题讨论】:

    标签: c# sql-server asp.net-mvc-5 ef-code-first


    【解决方案1】:

    由于每个Order 都会通过ItemsId forigen 键和Items 导航属性与之关联一个Item,因此您应该将Orders 集合属性添加到您的Items 实体中。

    public class Items
    {
        public int Id { get; set; }
        public string Code { get; set; }
        public int Quantity { get; set; }
    
        public ICollection<Orders> Orders { set; get; }
    }
    

    现在可以使用 LINQ 查询来获取每个项目的剩余数量。我会创建一个视图模型/DTO 来表示这些数据。

    public class ProductVm
    {
        public int Id { set; get; }
        public string Code { set; get; }
        public int RemainingQuantity { set; get; }
    }
    

    现在在您的 LINQ 查询中,获取 Items,从每个 Item 的 Orders 集合中获取 Quantity 的总和,然后从 Quantity 属性值中减去该总和。

    var products = db.Items
                     .Select(p => new ProductVm
                                   {
                                      Id = p.Id,
                                      Code = p.Code,
                                      RemainingQuantity = p.Quantity - p.Orders
                                                                        .Sum(n => n.Quantity)
                                   }).ToList();
    

    这里products 的类型将是List&lt;ProductVm&gt;

    【讨论】:

    • 非常感谢,我正在寻找这个收藏。
    • 您好,是否可以在 SQL Server 中制作类似于 View 的 ProductVM 静态对象?所以我只需要像普通对象一样访问ProductVM,而无需每次访问它时都进行LINQ查询吗?谢谢。
    • ProductVm 是一个类。您可以在任何地方使用它。
    • 谢谢你的回复,我的意思是我想试试这样public int RemainingQuantity { get { return this.Quantity - this.Orders.Sum( n =&gt; n.Quantity); } }可以吗?
    • 如果你愿意,你可以。您可以创建类似于您的实体类的视图模型类结构(使用 Order 的视图模型,它将用作您 ProductVm 中的 Orders 集合类型)并执行此操作。您需要读取实体并填充 ProductVm 对象。但你为什么要这样做?以上将为您提供所需的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2016-11-04
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多