Linq,扩展方法,Lambda表达式和Bool's

时间:2009-11-25 17:52:22

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

问候,我在使用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));

它们具有相同的效果,但没有任何效果。

4 个答案:

答案 0 :(得分:5)

您的第二次和第三次查询会“丢失”,因为您没有将它们分配给任何内容。尝试这样的事情:

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));

答案 1 :(得分: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));
    

答案 2 :(得分:0)

怎么样

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

答案 3 :(得分:0)

您的.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