我有一个LINQ查询,如下所示:
DateTime today = DateTime.UtcNow;
var results = from order in context.Orders
where ((order.OrderDate <= today) && (today <= order.OrderDate))
select order;
Run Code Online (Sandbox Code Playgroud)
我正在努力学习/了解LINQ.在某些情况下,我需要添加两个额外的WHERE子句.为了做到这一点,我正在使用:
if (useAdditionalClauses)
{
results = results.Where(o => o.OrderStatus == OrderStatus.Open) // Now I'm stuck.
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我知道如何添加额外的WHERE子句.但是我该如何添加多个?例如,我想补充一下
WHERE o.OrderStatus == OrderStatus.Open AND o.CustomerID == customerID
到我以前的查询.如何使用扩展方法执行此操作?
谢谢!
这两种查询上下文的方式有什么区别吗?
Firm firm = base.context.Firms
.Where(f => f.SomeId == someId)
.Where(f => f.AnotherId == anotherId)
.FirstOrDefault();
Firm firm = base.context.Firms
.Where(f => f.SomeId == someId && f.AnotherId == anotherId)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
似乎链接完全可以完成AND条件.我不相信你可以链接OR语句.是否有理由更喜欢一个,或者一个更好/更有效的情况?
以下问题:
我应该在LINQ查询中使用两个"where"子句或"&&"吗?
可以或者我应该在LINQ查询中将两个Where子句连接在一起吗?
linq样式,链接where子句vs和运营商
Jon Skeet:博客文章
大多数答案都表示,Linq To Objects在单个lambda表达式中链接where子句vs && 的性能可以忽略不计,因此可以根据您的编码风格决定使用哪一个.
我从查看IL程序集开始,你可以肯定地看到chaining where子句将导致Where扩展被调用2次而第二次调用的输入是第一次调用的结果.
var numbers = new List<int>() { 1, 2 ,3,4,5,6,7,8,9,10};
IEnumerable<int> query = numbers.Where(x=> x>2).Where(x => x<5);
Run Code Online (Sandbox Code Playgroud)
// IL
IL_005B: ldloc.0 // numbers
IL_005C: ldsfld UserQuery.CS$<>9__CachedAnonymousMethodDelegate3
IL_0061: brtrue.s IL_0076
IL_0063: ldnull
IL_0064: ldftn b__1
IL_006A: newobj System.Func<System.Int32,System.Boolean>..ctor
IL_006F: stsfld UserQuery.CS$<>9__CachedAnonymousMethodDelegate3
IL_0074: br.s IL_0076
IL_0076: ldsfld UserQuery.CS$<>9__CachedAnonymousMethodDelegate3
IL_007B: call System.Linq.Enumerable.Where <-----------First Call
IL_0080: ldsfld UserQuery.CS$<>9__CachedAnonymousMethodDelegate4
IL_0085: brtrue.s IL_009A
IL_0087: ldnull
IL_0088: ldftn b__2
IL_008E: newobj System.Func<System.Int32,System.Boolean>..ctor
IL_0093: …Run Code Online (Sandbox Code Playgroud)