Linq如何正确使用

koj*_*san 4 c# linq

这两个查询有什么区别?

它们不是一样的,哪一个是快速的?在哪里使用后会出现什么问题?写在哪里后,使我的代码对我来说可读.我这样做错了吗?

第一个查询:

   Model= (model.Where(p => p.Date.Year == yilim)
                        .Where(p => p.Id== 2 || p.Id== 3)
                        .OrderBy(m => m.Date.Month))
                        .ToList();
Run Code Online (Sandbox Code Playgroud)

第二个查询:

  Model= (model.Where(p => p.Date.Year == yilim && (p.Id== 2 || p.Id== 3))
                            .OrderBy(m => m.Date.Month))
                            .ToList();
Run Code Online (Sandbox Code Playgroud)

Ada*_*rth 5

没有功能差异,因为菊花链Where调用是一种逻辑AND操作,并且您正在AND将两个独立的条件放在一起.

但是,就删除编译器优化条件检查(例如短路)的能力和第二个所需的额外枚举器Where而不是仅仅一个枚举器而言,它的效率可能略低.(道歉,那部分只适用于Linq to Objects.)

如果您的代码OR符合条件,则只有第二个查询会提供您想要的内容:

Model= (model.Where(p => p.Date.Year == yilim || p.Id== 2 || p.Id== 3)
                          .OrderBy(m => m.Date.Month))
                          .ToList();

// Cannot express the above query in simple daisy-chained Where calls.
Run Code Online (Sandbox Code Playgroud)

如果a中的逻辑Where变得难以阅读,请尝试"无评论编码"并将条件填充到具有非常可读名称的方法中,然后您可以执行.Where(x => TheCustomerNameIsValid(x))或方法对其进行分组.Where(TheCustomerNameIsValid)(如果可以).这也有助于调试,因为在一个方法中放置断点比在lambda中放置断点要少一些.