gpt4 book ai didi

c# - 带有语句体的 lambda 表达式不能转换为表达式树(Lambda 和 Linq)

转载 作者:行者123 更新时间:2023-12-03 21:28:31 28 4
gpt4 key购买 nike

搜索了很多但没有找到适合我的解决方案。我在 lambda 表达式 中引入了一个变量,这就是显示此错误消息的原因。此外,我可以解决编写“SQL Like Linq Query”的问题,但这不是我的期望。我的期望是在“Linq Using Lambda Expression”中引入变量。可不可以??

A lambda expression with a statement body cannot be converted to an expression tree.

这是我的代码:

IQueryable<IGrouping<int, AnimalFood>> animalFoods = db.AnimalFoods.GroupBy(x => x.FoodId);
IQueryable<FoodSummaryViewModel> foodSummaryViewModel = animalFoods.Select(g =>
{
var animalFood = g.FirstOrDefault();
return new FoodSummaryViewModel()
{
FoodName = animalFood.Food.FoodName,
FoodPrice = animalFood.Food.UnitPrice,
TotalFoodQuantity = g.Sum(x => x.Animal.AnimalQuantity * x.FoodQuantity),
TotalPrice = g.Sum(x => x.Animal.AnimalQuantity * x.FoodQuantity) * animalFood.Food.UnitPrice
};
});
return foodSummaryViewModel.ToList();

最佳答案

错误信息非常清楚:你有一个带有语句体的 lambda 表达式,它根本无法转换为表达式树(至少不能由编译器自动转换)。因此,您的 linq 提供程序无法从中创建查询以发送到数据库(即使您手动创建了表达式树,这并不简单,您的 linq 提供程序也无法将其转换为 SQL 查询)。

您有两个选择。选项一是重写您的查询,使其不包含语句正文,如其他人所示。

另一种选择是使用 linq to objects 在内存中执行部分查询。您必须小心使用这种方法,并避免从数据库中获取太多数据。但是这样做的方法是:

IEnumerable<IGrouping<int, AnimalFood>> animalFoods = 
db.AnimalFoods.GroupBy(x => x.FoodId).AsEnumerable();
IEnumerable<FoodSummaryViewModel> foodSummaryViewModel = animalFoods.Select(g =>
{
var animalFood = g.FirstOrDefault();
return new FoodSummaryViewModel()
{
FoodName = animalFood.Food.FoodName,
FoodPrice = animalFood.Food.UnitPrice,
TotalFoodQuantity = g.Sum(x => x.Animal.AnimalQuantity * x.FoodQuantity),
TotalPrice = g.Sum(x => x.Animal.AnimalQuantity * x.FoodQuantity) * animalFood.Food.UnitPrice
};
});
return foodSummaryViewModel.ToList();

这可能会给你你认为你想要的东西,但这可能不是一个好主意。您的选择器正在使用 AnimalFood.Animal.AnimalQuatity 属性链,这可能会导致延迟加载,具体取决于您的 Linq 提供程序。如果您已将其配置为使用预先加载,您可能不会更好,因为您可能加载了太多数据。

所以您最好重写您的查询。你确定这样的事情不能完成工作吗:

var q = from food in db.Foods
select new FoodSummaryViewModel
{
FoodName = food.FoodName,
FoodPrice = food.UnitPrice,
TotalFoodQuantity = (from fa in food.AnimalFoods
select fa.Animal.AnimalQuantity).Sum() * food.FoodQuantity
TotalPrice = (from fa in food.AnimalFoods
select fa.Animal.AnimalQuantity).Sum() * food.FoodQuantity * food.UnitPrice
};
return q.ToList();

关于c# - 带有语句体的 lambda 表达式不能转换为表达式树(Lambda 和 Linq),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39544206/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com