【问题标题】:LINQ - How to write a query, when the model has a list property?LINQ - 当模型具有列表属性时,如何编写查询?
【发布时间】:2021-05-10 13:10:42
【问题描述】:

我正在用 C# (ASP.NET Core API) 开发数据库表。两个表具有一对多关系(一个Order 有多个ToBeOrdered)。信息:这些只是两个表,不是全部。 问题是,当我尝试创建一个必须包含来自ToBeOrdered 表的一个或多个元素的Order 元素时,程序实际上会创建许多Orders,每个都包含一个ToBeOrdered 元素而不是列表.

Order模特:

[Key]
public string Id { get; set; }

public string SupplierId { get; set; }
public Supplier Supplier { get; set; }

public List<ToBeOrdered> ToBeOrdered { get; set; }

ToBeOrdere模特:

[Key]
public string Id { get; set; }
[Required]
public int Quantity { get; set; }

public string ProductId { get; set; }
public Product Product { get; set; }

public string ProjectId { get; set; }
public Project Project { get; set; }

public string OrderId { get; set; }
public Order Order { get; set; }

查询:

public IEnumerable<Order> CreateOrder(string supplierId)
    {
        IEnumerable<Order> result =
            from tbo in _context.ToBeOrdered
            join p in _context.Products
                on tbo.ProductId equals p.Id
            where p.SupplierId == supplierId
            select new Order
            {
                SupplierId = supplierId,
                ToBeOrdered = new List<ToBeOrdered> {tbo}
            };

        return result;
    }

Order 模型结果例如:

[
{
    "id": "7deeb60b-e9b4-4925-ac39-7dd983df5f24",
    "supplierId": "c76e873d-6bcd-4f97-bacc-a7c55b813d06",
    "supplier": null,
    "toBeOrdered": [
        {
            "id": "1",
            "quantity": 10,
            "productId": "bb4f5a16-1d6e-483c-89f5-7d16ba357691",
            "product": null,
            "projectId": "068e61cf-50b6-4669-9709-cd279b26ecf3",
            "project": null,
            "orderId": null,
            "order": null
        }
    ]
},
{
    "id": "a186887c-6009-4e18-a81a-5b40f8f0ba06",
    "supplierId": "c76e873d-6bcd-4f97-bacc-a7c55b813d06",
    "supplier": null,
    "toBeOrdered": [
        {
            "id": "2",
            "quantity": 20,
            "productId": "bb4f5a16-1d6e-483c-89f5-7d16ba357691",
            "product": null,
            "projectId": "068e61cf-50b6-4669-9709-cd279b26ecf3",
            "project": null,
            "orderId": null,
            "order": null
        }
    ]
}
]

结果中应该只有一个Order 和两个ToBeOrdered 模型在列表中。 我应该在 LINQ 查询中进行哪些更改?

【问题讨论】:

  • ToBeOrdered = tbo.Order.ToBeOrdered ?
  • 没有。不幸的是,它并不好。
  • 是否启用了延迟加载?如果是,则将您的列表标记为虚拟。公共虚拟列表 ToBeOrdered { get;放; } 并忘记加入。只需从数据库加载您的订单。 ToBeOrdered 将相应地填充。不要忘记添加 [foreignkey] 属性。
  • 为什么不在模型/数据库中建立关系,然后只需要查询顶层?

标签: asp.net linq asp.net-core-webapi


【解决方案1】:

试试这个查询:

public IEnumerable<Order> CreateOrder(string supplierId)
    {
       return  _context.Set<Order>()
           .Include(i=i.ToBeOrdered);
            .Where(i=> i.SupplierId == supplierId)
            ToArray();
    }

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多