繁体   English   中英

编写LINQ C#的方法

[英]Methods of writing LINQ C#

我对下面的事情感到困惑。

我一直在我的项目中使用LINQ,使用以下格式:

var query =     
    from obj_i in set1
    join obj_j in set2 on 
        new { 
          JoinField1 = obj_i.SomeField1,
          JoinField2 = obj_i.SomeField2,
          JoinField3 = obj_i.SomeField3,
          JoinField4 = obj_i.SomeField4
        } 
        equals 
        new { 
          JoinField1 = obj_j.SomeOtherField1,
          JoinField2 = obj_j.SomeOtherField2,
          JoinField3 = obj_j.SomeOtherField3,
          JoinField4 = obj_j.SomeOtherField4
        }

但我最近被告知,下面也是编写LINQ查询的“另一种方式”。

var query =     
    from obj_i in set1
    join obj_j in set2 on       
    obj_i.SomeField1 = obj_j.SomeOtherField1 and
    obj_i.SomeField2 = obj_j.SomeOtherField2 and
    obj_i.SomeField3 = obj_j.SomeOtherField3 and
    obj_i.SomeField4 = obj_j.SomeOtherField4

据我所知,使用single =是错误的(特别是在by ==不适用的情况下,因为你需要使用equals ,但也使用and错误,因为正确的关键字将是&&如果你被允许使用在这种情况下,任何东西都是equals

我可以理解在where子句中使用&&== ,这使得上面的代码可以使用更加出色,因为它甚至不能编译。

我错过了什么吗? 如果是这样,你能指点我在哪里学习这种编写LINQ的替代方法吗?

但我最近被告知,下面也是编写LINQ查询的“另一种方式”。

不,您显示的第二种语法不正确。 试试吧,你会发现它没有编译。

Linq查询理解语法中的join子句被转换为对Join扩展方法的调用。 例如,这个查询:

var query =
    from x in a
    join y in b
    on x.Foo equals y.Bar
    select Baz(x, y);

被翻译成:

var query = a.Join(b, x => x.Foo, y => y.Foo, (x, y) => Baz(x, y));

因此,您可以看到equals左侧和右侧的部分对应于Join方法的不同参数:左侧部分选择第一个源的连接键,右侧部分选择第二个源的键。 然后将这些密钥相互匹配以执行连接。 这是重要的部分: on子句没有指定自由格式连接条件,它指定了如何在每一侧提取连接键。 所以左右键选择器必须清楚分开; 您显示的第二个语法无法工作,因为无法为任一源提取完整的密钥信息:只能通过评估每个(x, y)的连接条件来执行连接,这是一个O(n²)操作而不是(大致) O(n)操作。

但是,有时候你需要比equi-join更灵活的灵活性; 在这种情况下,您可以使用交叉连接并过滤结果:

var query =
    from x in a
    from y in b
    where x.Foo == y.Bar
    select Baz(x, y);

或者在你的情况下:

var query =     
    from obj_i in set1
    from obj_j in set2
    where obj_i.SomeField1 == obj_j.SomeOtherField1
    &&    obj_i.SomeField2 == obj_j.SomeOtherField2
    &&    obj_i.SomeField3 == obj_j.SomeOtherField3
    &&    obj_i.SomeField4 == obj_j.SomeOtherField4;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM