问候,我在使用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));
它们具有相同的效果,但没有任何效果。
答案 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