【问题标题】:Linq, Where Extension Method, Lambda Expressions, and Bool'sLinq、Where 扩展方法、Lambda 表达式和 Bool 的
【发布时间】:2010-12-20 09:40:43
【问题描述】:

您好,我在使用 Linq to Entities 获得的 IQueryable 对象的 Where 子句扩展方法中使用 bool 操作时遇到了一些问题。第一个示例显示了使用 Bool1 作为我需要移动到 where 子句扩展方法的操作的工作原理。第二个示例是更改后不起作用的内容。 Bool1 被完全忽略,不会影响结果。

示例 1:

var results =
     from a in context.aTable1
     where a.Bool1 == false && a.Bool2  == false
     select new
     {
           Column1 = a.Column1
           Bool1 = a.Bool1
           Bool2 = a.Bool2
     };

results.Where(l => l. Column1.Contains(fooString));

示例 2:

var results =
     from a in context.aTable1
     where a.Bool2  == false
     select new
     {
           Column1 = a.Column1
           Bool1 = a.Bool1
           Bool2 = a.Bool2
     };

results.Where(l => l.Bool1 == false);
results.Where(l => l. Column1.Contains(fooString));

这些是过度简化的示例,但我希望它们能展示我正在尝试做的事情。 where 扩展方法使用不同的方法,是我创建原始查询时无法完成它们的原因。

我已经尝试了以下其他方法来使用 where 子句做同样的事情:

results.Where(l => !l.Bool1);
results.Where(l => l.Bool1.Equals(false));

它们具有相同的效果。

【问题讨论】:

    标签: c# linq .net-3.5 linq-to-entities iqueryable


    【解决方案1】:

    您的第二个和第三个查询正在“丢失”,因为您没有将它们分配给任何东西。试试这样的:

    var results = from a in context.aTable1
                  where !a.Bool2
                  select new
                  {
                      Column1 = a.Column1
                      Bool1 = a.Bool1
                      Bool2 = a.Bool2
                  };
    
    results = results.Where(l => !l.Bool1);
    results = results.Where(l => l.Column1.Contains(fooString));
    

    【讨论】:

    • DOH!!!我觉得自己很愚蠢,我不敢相信我没有注意到我忘记分配它。感谢您的帮助!
    【解决方案2】:

    您没有将查询结果分配给任何东西。对Where() 的每次调用都会返回该查询的结果,您需要对其进行处理。

    在您的情况下,您有几个选项(所有选项都会产生相同的最终结果):

    • 如果您想对非 Bool1 结果做一些事情,您可以选择保留它们:

      var notBool1 = results.Where(l => !l.Bool1);
      var query = notBool1.Where(l => l.Column1.Contains(fooString));
      
    • 您可以将Where() 调用链接在一起:

      var query = results.Where(l => !l.Bool1)
                         .Where(l => l.Column1.Contains(fooString));
      
    • 这可能是最快的,虽然可能不是很多:

      var query = results.Where(l => !lBool1 && l.Column1.Contains(fooString));
      

    【讨论】:

      【解决方案3】:

      怎么样

      results.Where(l => l.Bool1 == false && l.Column1.Contains(fooString));
      

      【讨论】:

        【解决方案4】:

        您的.Where 查询返回一个集合,它们不会修改调用它们的集合。

        var numbers = new int [] { 1,2,3,4,5,6};
        numbers.Where(x => x % 2 == 0); // numbers still contains 1,2,3,4,5,6
        var evens = numbers.Where(x => x % 2 == 0); // evens contains 2,4,6, numbers 1,2,3,4,5,6
        numbers = numbers.Where(x => x % 2 == 0); // numbers now contains 2,4,6
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多