从LINQ中的两个表中获取数据

从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

我试图获取一个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).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);