Linq - 如何在变量中存储“where condition”

时间:2011-01-27 16:08:52

标签: linq linq-to-entities

可以在变量中存储此linq语句中的Where条件吗?

Func<NutritionValues, bool> condition;
if (isBarcode)
   condition = f => f.barcode == name;
else
   condition = f => f.food == name;


var foods = context.NutritionValues.Where(condition).
                                    Select(f => new SerializableFood
                                    {
                                         Name = f.food,
                                         Calories = f.energy_kcal,
                                         Carbohydrates = f.carbohydrates,
                                         Fats = f.fats,
                                         Proteins = f.protiens
                                    });

条件是100%正确。如果我将条件f => f.barcode == name直接写入其中有效的Where函数,但这种方式不行。此代码返回空集。拜托,你知道为什么吗?

2 个答案:

答案 0 :(得分:2)

您可能正在使用LINQ to SQL或类似的东西。

您应该将变量更改为Expression<Func<NutritionValues, bool>>;这将允许查询提供程序解析您的条件。

答案 1 :(得分:0)

哦,我的,这里可能会发生很多事情。首先,您应该将condition键入Expression<Func<NutritionValues, bool>>。这将让您的查询提供程序正确解析它。

其次,您正在捕获变量(name),并且如果您在捕获时间和查询实际执行时间之间修改该变量的值(请注意,查询不会执行,直到你迭代foods,它没有在你向我们展示的任何代码中执行过,你会看到不同于你预期的结果。有关此主题的更多信息,请参阅Closing over the loop variable considered harmful