[英]Writing and downloading a csv file using linq methods in c# is returning wrong data
[英]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.