C# Linq,其中扩展方法、Lambda表达式和Bool';s

C# Linq,其中扩展方法、Lambda表达式和Bool';s,c#,linq,.net-3.5,linq-to-entities,iqueryable,C#,Linq,.net 3.5,Linq To Entities,Iqueryable,您好,我在使用LINQtoEntities获得的IQueryable对象的Where子句扩展方法中使用bool操作时遇到了一些问题。第一个示例展示了使用Bool1作为操作的工作原理,我需要移动到where子句扩展方法。第二个例子是更改后不起作用的内容。Bool1被完全忽略,不会影响结果 例1: var results = from a in context.aTable1 where a.Bool1 == false && a.Bool2 == false

您好,我在使用LINQtoEntities获得的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));

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

您的第二个和第三个查询正在“丢失”,因为您没有将它们分配给任何对象。请尝试以下方法:

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

您没有将查询结果分配给任何对象。每次调用
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));
    
    • 怎么样

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

      您的
      。当
      查询返回集合时,它们不会修改调用它们的集合

      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
      

      DOH!!!我觉得自己很蠢,真不敢相信我竟然没有注意到我忘了分配它。谢谢你帮我摇滚!!