【问题标题】:Linq - How to store "where condition" in variableLinq - 如何将“where条件”存储在变量中
【发布时间】:2011-01-28 00:53:54
【问题描述】:

是否可以将此 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 =&gt; f.barcode == name 直接写入 Where 函数,它可以工作,但这种方式不行。此代码返回空集。请问,你知道为什么吗?

【问题讨论】:

    标签: linq linq-to-entities


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      哦,天哪,这里可能会发生很多事情。首先,您应该键入condition 作为Expression&lt;Func&lt;NutritionValues, bool&gt;&gt;。这将使您的查询提供程序正确解析它。

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

      【讨论】:

      • 我不想让你的头脑用更多的代码。但是在这种情况下,最好公开更多代码。我知道惰性评估,所以我不会在执行前修改捕获的变量。感谢您的帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 2021-03-21
      • 2014-08-01
      • 2011-01-12
      • 1970-01-01
      相关资源
      最近更新 更多