使用嵌套查询扩展

时间:2018-09-20 06:21:43

标签: c# sql .net entity-framework .net-core

我想制作将数据库模型映射到视图模型的查询扩展,但我也想将它们重新用于关系模型。

客户实体具有属性

public virtual ICollection<Order> Orders { get; set; }

并且映射是通过查询扩展

完成的
var viewModelList = dbContext.Customers
                .Include(a => a.Orders)
                .ToCustomersModel()
                .ToList();


public static IQueryable<CustomersModel> ToCustomersModel(this IQueryable<Customer> query)
{
    return query.Select(customer => new CustomersModel
                        {
                            Id = customer.Id,
                            Name = customer.Name,
                            Orders = customer.Orders.AsQueryable().ToOrdersModel().ToList()
                        });
}

public static IQueryable<OrdersModel> ToOrdersModel(this IQueryable<Order> query)
{
    return query.Select(customer => new OrdersModel
                        {
                            Id = order.Id,
                            ProductName = order.ProductName
                        });

它引发异常

  

System.InvalidOperationException:'对此进行了第二次操作   上一个操作完成之前的上下文。任何实例成员   不能保证是线程安全的。'

我正在使用Entity Framework Core 2.1和.net Core 2.1

1 个答案:

答案 0 :(得分:0)

如果不需要调用Iqueryable方法怎么办

var viewModelList = dbContext.Customers
                .Include(a => a.Orders)
                .ToCustomersModel()
                .ToList();


public static IQueryable<CustomersModel> ToCustomersModel(this IQueryable<Customer> query)
{
    return query.Select(customer => new CustomersModel
                        {
                            Id = customer.Id,
                            Name = customer.Name,
                            Orders = customer.Orders.ToList().Select(customer => new OrdersModel
                                                           {
                                                               Id = order.Id,
                                                               ProductName = order.ProductName
                                                           }).ToList()
                        });
}