2

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

4 回答 4

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));
于 2009-11-25T17:59:28.503 回答
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));
    
于 2009-11-25T17:59:46.533 回答
0

怎么样

results.Where(l => l.Bool1 == false && l.Column1.Contains(fooString));
于 2009-11-25T18:00:51.427 回答
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
于 2009-11-25T18:09:58.137 回答