我有一个查询来获取所有订单的详细信息。我有这样的查询:
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,但我不知道这是一个好方法吗?
答案 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();