如何使用 LINQ to Entities(带有转换)返回嵌套数据集?

发布于 2024-12-26 19:29:16 字数 1446 浏览 2 评论 0原文

我正在将实体对象转换为我自己的模型(CustomerModel 和 OrderModel)。

我目前有一个返回我的客户的 IQueryable 方法:

IQueryable<CustomerModel> GetCustomers()
{
    return from c in entities.Customers
           select new CustomerModel {
               CustomerId = c.CustomerId,
               CustomerName = c.CustomerName
               // Orders = ??
           };
}

在我的 CustomerModel 中,您可以看到我有一个订单数组。

class CustomerModel {
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }
    public OrderModel[] Orders { get; set; }
}

class OrderModel {
    public int OrderId { get; set; }
    public int CustomerId { get; set; }
    public string OrderDetails { get; set; }
}

当订单类型为数组时,我似乎无法弄清楚如何在客户对象内部设置订单。

当我将 CustomerModel 的 Orders 更改为 IEnumerable 而不是数组时,我能够做到这一点,并且您不能将 .ToArray() 与 LINQ to Entities 一起使用,所以我陷入了困境。

所以我的问题是:使用订单数组可以做到这一点吗?

问题解答

  • 为什么是数组?我在其他地方返回一个数组(供其他项目使用),并且让 Orders 也成为一个数组是有意义的。

此外,您不能对订单使用 ToArray(),会引发此错误:

System.NotSupportedException: LINQ to Entities does not recognize the method 'Proj.Models.Orders[] ToArray[Orders](System.Collections.Generic.IEnumerable`1[Proj.Models.Orders])' method, and this method cannot be translated into a store expression.

I'm performing a transform on the entity objects into my own models (CustomerModel and OrderModel).

I currently have an IQueryable method that returns my Customers:

IQueryable<CustomerModel> GetCustomers()
{
    return from c in entities.Customers
           select new CustomerModel {
               CustomerId = c.CustomerId,
               CustomerName = c.CustomerName
               // Orders = ??
           };
}

In my CustomerModel, you can see I have an array of Orders.

class CustomerModel {
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }
    public OrderModel[] Orders { get; set; }
}

class OrderModel {
    public int OrderId { get; set; }
    public int CustomerId { get; set; }
    public string OrderDetails { get; set; }
}

I can't seem to figure out how set Orders inside of the Customer object when the Orders type is Array.

I was able to do it when I changed the CustomerModel's Orders to be IEnumerable instead of an array and you cannot use .ToArray() with LINQ to Entities, so I'm stuck.

So my question is: is this possible to do using an Array for Orders?

Answers to Questions:

  • Why an Array? I'm returning an array (for consumption by other projects) elsewhere and it made sense to have the Orders be an Array as well.

Also, you cannot use ToArray() for the Orders, this error is thrown:

System.NotSupportedException: LINQ to Entities does not recognize the method 'Proj.Models.Orders[] ToArray[Orders](System.Collections.Generic.IEnumerable`1[Proj.Models.Orders])' method, and this method cannot be translated into a store expression.

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

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

发布评论

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

评论(2

尝蛊 2025-01-02 19:29:17

如果您的 Orders 可以从 Customers 访问,您可以尝试:

IQueryable<CustomerModel> GetCustomers()
{
    return from c in entities.Customers
           select new CustomerModel {
               CustomerId = c.CustomerId,
               CustomerName = c.CustomerName
               Orders = from o in c.Orders
                        select new Order{
                            OrderId = o.OrderId,
                            ...
                        }
           };
}

这需要您将 Customer.Orders 更改为 IEnumerable。这是在对数据库的一次请求中加载对象图的唯一方法。

If your Orders are accessible from Customers, you can try:

IQueryable<CustomerModel> GetCustomers()
{
    return from c in entities.Customers
           select new CustomerModel {
               CustomerId = c.CustomerId,
               CustomerName = c.CustomerName
               Orders = from o in c.Orders
                        select new Order{
                            OrderId = o.OrderId,
                            ...
                        }
           };
}

This requires you to change Customer.Orders to an IEnumerable<Order>. That is the only way to load the object graph in one request to the database.

翻了热茶 2025-01-02 19:29:17

当我们的数据访问方法返回业务对象(模型)时,这不是很好的做法。您可以通过以下方式编辑您的查询:

IQueryable<Customer> GetCustomers()
{
    return entities.Customers;
}

IQueryable<Order> GetOrders()
{
    return entities.Orders;
}

IEnumerable<CustomerModel> GetCustomerModels()
{
    var result = from c in GetCustomers()
                 let orderModels = from o in GetOrders() 
                                   where o.CustomerId == c.CustomerId
                                   select new OrderModel
                                   {....}
                 select new CustomerModel  
                 {
                     CustomerId = c.CustomerId,
                     CustomerName = c.CustomerName,
                     Orders = orderModels.ToArray()
                 }; 
    return result;
}

如果此解决方案对您没有用,请描述您的“实体”

Not very good practise when our Data Access method returns business objects (models). You can edit your queries for example in such way:

IQueryable<Customer> GetCustomers()
{
    return entities.Customers;
}

IQueryable<Order> GetOrders()
{
    return entities.Orders;
}

IEnumerable<CustomerModel> GetCustomerModels()
{
    var result = from c in GetCustomers()
                 let orderModels = from o in GetOrders() 
                                   where o.CustomerId == c.CustomerId
                                   select new OrderModel
                                   {....}
                 select new CustomerModel  
                 {
                     CustomerId = c.CustomerId,
                     CustomerName = c.CustomerName,
                     Orders = orderModels.ToArray()
                 }; 
    return result;
}

if this solution is not useful for you, please describe your "entities"

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