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

时间:2016-01-29 05:36:45

标签: 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).Distinct();

3 个答案:

答案 0 :(得分:0)

你可以简单地使用这个

 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());

答案 1 :(得分:0)

您只需Concat IP列和group by IP。 然后只选择计数为1的组(= IP仅出现在一个表中)

var res =
        (from ip in CS.A.Select(x => x.ip)
                        .Distinct()
                        .Concat(CS.B.Select(x => x.ip).Distinct())
         group ip by ip into grp
         where grp.Count() == 1
         select grp.Key).ToList();

您可以使用以下示例对此进行测试:

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);

答案 2 :(得分:-1)

我的第一个建议是使用商店程序来实现这一目标。有点像:

SELECT tblA.ip, tblB.ip FROM Table1 tblA
INNER JOIN Table2 tblB
ON 1=1
GROUP BY tblA.ip

这里的“开启”会给你一个永远正确的条件。

大致相同的查询也应该与linq一起使用。实验: - )

修改 UNION也是一种选择,但非SQL开发人员很容易阅读。

Select distinct cmnTbl.ip from (SELECT tblA.ip from Table1 tblA UNION SELECT tblB.ip from Table1) cmnTbl