无法在Select Method中调用其他服务 - Linq

时间:2016-05-18 07:06:56

标签: c# linq

我有一个查询来获取所有订单的详细信息。我有这样的查询:

 return
           _orderMasters.OrderByDescending(row => row.Code).Where(row => row.Code == code).Include(row => row.Orderdetails)
             .Select(row => new OrderViewModel
             {
                 Code = row.Code,
                 // other fields
                 Items = row.Orderdetails.Select(detail => new OrderItemViewModel
                 {
                     ProductcombinationId = detail.ProductCombinationId,
                     ProductId=detail.ProductAttributeCombination.ProductId,
                     ProductName = detail.ProductCombination.Product.Name,
                     ProductCombinationName=_productCombinationService.GetCombinationsName(detail.ProductCombinationId,detail.ProductCombination.ProductId) // * this row
                 }).ToList(),
                 ShippingAddress = new AddressViewModel()
                 {
                     //set fileds value
                 }
             }).FirstOrDefault();

符合*我需要获得ProductcombinationName,为此我在另一个服务中调用Method,但得到此错误:

LINQ to Entities does not recognize the method

第一个想法是,为所有行添加foreach并调用Method来获取ProductcombinationName,但我不知道这是一个好方法吗?

2 个答案:

答案 0 :(得分:2)

你不能在linq中使用c#函数,因为linq尝试在sql端执行代码,其中sql不理解你的c#函数是什么并给出错误。
为此,
你可以这样做

                 Items = row.Orderdetails.Select(detail => new OrderItemViewModel
                 {
                     ProductcombinationId = detail.ProductCombinationId,
                     ProductId=detail.ProductAttributeCombination.ProductId,
                     ProductName = detail.ProductCombination.Product.Name,
                     ProductCombination = detail.ProductCombination // need to add for next operation
                 }).ToList(),

然后

foreach(var item in Items)
{
     // add ProductCombinationName code here
}

答案 1 :(得分:1)

实体框架不会将C#代码作为其查询的一部分运行,它必须能够将查询转换为实际的SQL表达式。

因此,我们必须将查询表达式重组为Entity Framework可以处理的表达式。

var orders = _orderMasters.OrderByDescending(row => row.Code)
                          .Where(row => row.Code == code)
                          .Include(row => row.Orderdetails)
                          .ToList();


return   orders.Select(row => new OrderViewModel
         {
             Code = row.Code,
             // other fields
             Items = row.Orderdetails.Select(detail => new OrderItemViewModel
             {
                 ProductcombinationId = detail.ProductCombinationId,
                 ProductId=detail.ProductAttributeCombination.ProductId,
                 ProductName = detail.ProductCombination.Product.Name,
                 ProductCombinationName=_productCombinationService.GetCombinationsName(detail.ProductCombinationId,detail.ProductCombination.ProductId) // * this row
             }).ToList(),
             ShippingAddress = new AddressViewModel()
             {
                 //set fileds value
             }
         }).FirstOrDefault();