相关疑难解决方法(0)

使用LINQ扩展方法的多个WHERE子句

我有一个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

到我以前的查询.如何使用扩展方法执行此操作?

谢谢!

c# linq

71
推荐指数
4
解决办法
11万
查看次数

LINQ:单个具有多个条件的区域和具有单个条件的连续Wheres之间的差异

Where在LINQ 中连接多个而不是使用Where具有多个条件的单个数据是否有任何缺点?

我问,因为使用多个Where可以帮助降低复杂性并大大提高代码的可维护性.

考虑下面的代码,chargeList是一个List<Charge>来源BindingSource:

IEnumerable<Charge> matchingCharges = chargeList;
if(!string.IsNullOrWhiteSpace(channelAbbr))
    matchingCharges = matchingCharges
        .Where(c => c.ChannelAbbreviation == channelAbbr);
if(deliveryNoteDate.HasValue)
    matchingCharges = matchingCharges
        .Where(c => c.ArrivalAt == deliveryNoteDate.Value);
if(chargeID.HasValue)
    matchingCharges = matchingCharges
        .Where(c => c.ChargeID == chargeID.Value);
Run Code Online (Sandbox Code Playgroud)

这个简洁的代码将处理filter,none,one,two,all的所有组合.

否则我必须if-else在一个单独使用和多个条件Where.

这是我想到的最好的:

// important to keep code readable:
bool filterChannel = !string.IsNullOrWhiteSpace(channelAbbr);
bool filterDate = deliveryNoteDate.HasValue;
bool filterID = chargeID.HasValue;

if(!filterChannel && !filterDate && !filterID)
{
    // take all …
Run Code Online (Sandbox Code Playgroud)

c# linq

14
推荐指数
2
解决办法
2328
查看次数

Linq to Objects链接哪个子句VS &&性能命中是微不足道的?

以下问题:
我应该在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)

.net c# performance linq-to-objects

10
推荐指数
1
解决办法
1928
查看次数

为什么LINQ使用多个WHERE谓词使用多个AND更慢?

经常使用LINQ来过滤对象数组

我运行了一个产生相同结果的测试表达式,但是在不同的时间,我想知道这种行为的原因.

public long testTimeOperetionWHERE()
{
    Object[] list = opCoIn.getList();
    System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();


    int i = 0;
    while (i<20000)
    {
        var result = list.Where(o => o.Id>0)
                     .Where(o => o.Import>0)
                     .Where(o => o.OrderConfirm==o.NumberConfirm)
                     .Where(o => o.IdActiveCustomer>100 );
        i++;
    }

    long e = sw.ElapsedMilliseconds; 

    return e;
}
Run Code Online (Sandbox Code Playgroud)

时间成本结果总是在90-80之间变化

在这种情况下

public long testTimeOperetionAND()
{
    Object[] list = opCoIn.getList();
    System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();


    int i = 0;
    while (i < 20000)
    {
        var result = list.Where(o => o.Id > 0
                                && o.Import > …
Run Code Online (Sandbox Code Playgroud)

.net c# linq visual-studio

-2
推荐指数
1
解决办法
220
查看次数

标签 统计

c# ×4

linq ×3

.net ×2

linq-to-objects ×1

performance ×1

visual-studio ×1