从LINQ中的两个表中获取数据
我试图获取一个IP地址列,该列在表A和表B中都存在。表A有许多IP地址,而表B中没有特定的IP地址。我希望这两个表都有不同的IP地址。这意味着我希望表A中的所有IP地址都不在表B中,加上表B中的所有IP地址都不在表A中。我正在尝试下面的代码,它只给出了表B中不存在的IP地址。请帮助从LINQ中的两个表中获取数据,linq,Linq,我试图获取一个IP地址列,该列在表A和表B中都存在。表A有许多IP地址,而表B中没有特定的IP地址。我希望这两个表都有不同的IP地址。这意味着我希望表A中的所有IP地址都不在表B中,加上表B中的所有IP地址都不在表A中。我正在尝试下面的代码,它只给出了表B中不存在的IP地址。请帮助 var ips= (from a in CS.A where !CS.B.Any(f => f.IPAddress == a.IPAddress) select a.IPAddress).Distin
var ips= (from a in CS.A
where !CS.B.Any(f => f.IPAddress == a.IPAddress)
select a.IPAddress).Distinct();
我的第一个建议是使用存储过程来实现这一点。大致如下:
SELECT tblA.ip, tblB.ip FROM Table1 tblA
INNER JOIN Table2 tblB
ON 1=1
GROUP BY tblA.ip
这里的“ON”将为您提供一个始终为真的条件
大致相同的查询也适用于linq。实验:-)
编辑
UNION也是一种选择,但是非SQL开发人员不太容易阅读
Select distinct cmnTbl.ip from (SELECT tblA.ip from Table1 tblA UNION SELECT tblB.ip from Table1) cmnTbl
你可以简单地使用这个
var ips= ((from a in CS.A
where !CS.B.Any(f => f.IPAddress == a.IPAddress)
select a.IPAddress).Distinct()).Union((from b in CS.B
where !CS.A.Any(f => f.IPAddress == b.IPAddress)
select b.IPAddress).Distinct());
您只需将IP列和IP分组即可。 然后仅选择计数为1的组(=IP仅出现在一个表中) 您可以使用以下示例对此进行测试:
var x1 = Enumerable.Range(0, 20);
var x2 = Enumerable.Range(5, 20);
var res =
(from ip in x1.Select(x => x).Distinct().Concat(x2.Select(x => x).Distinct())
group ip by ip into grp
where grp.Count() == 1
select grp.Key).ToList();
res.ForEach(Console.WriteLine);
可能重复使用just use the
.Union
操作符(请参阅我在投票结束时提供的链接)@Carsten您是对的。我通常更喜欢使用内部联接和分组方式,因为它对普通用户更具可读性。但是使用Union和Distinct是一种伟大的“高级”技术。为什么简单的Union
比在1=1上使用奇怪的的内部联接更难阅读但你想怎么做就怎么做——这对我来说真的很奇怪me@Carsten你能解释一下吗
var x1 = Enumerable.Range(0, 20);
var x2 = Enumerable.Range(5, 20);
var res =
(from ip in x1.Select(x => x).Distinct().Concat(x2.Select(x => x).Distinct())
group ip by ip into grp
where grp.Count() == 1
select grp.Key).ToList();
res.ForEach(Console.WriteLine);