读书人

linq多次Join on 查询语句的有关问题

发布时间: 2012-02-28 13:06:36 作者: rapoo

linq多次Join on 查询语句的问题
当我用下面的linq语句查询出来的结果存在很多的重复数据:
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 1 CPU 1 1%
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 1 CPU 13 0%
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 1 CPU 25 0%
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 2 MEM 2 1.24GB
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 2 MEM 14 1.28GB
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 2 MEM 26 1.30GB
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 3 HDD 3 4.3G/3G
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 3 HDD 15 4.4G/4G
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 3 HDD 27 4.4G/3G
1 211.143.*.* iserver1 2 2010-8-12 0:00:00 1 陈** 1 CPU 1 1%
1 211.143.*.* iserver1 2 2010-8-12 0:00:00 1 陈** 1 CPU 13 0%
1 211.143.*.* iserver1 2 2010-8-12 0:00:00 1 陈** 1 CPU 25 0%
1 211.143.*.* iserver1 2 2010-8-12 0:00:00 1 陈** 2 MEM 2 1.24GB
1 211.143.*.* iserver1 2 2010-8-12 0:00:00 1 陈** 2 MEM 14 1.28GB
1 211.143.*.* iserver1 2 2010-8-12 0:00:00 1 陈** 2 MEM 26 1.30GB
1 211.143.*.* iserver1 2 2010-8-12 0:00:00 1 陈** 3 HDD 3 4.3G/3G
1 211.143.*.* iserver1 2 2010-8-12 0:00:00 1 陈** 3 HDD 15 4.4G/4G
1 211.143.*.* iserver1 2 2010-8-12 0:00:00 1 陈** 3 HDD 27 4.4G/3G
1 211.143.*.* iserver1 3 2010-8-13 0:00:00 1 陈** 1 CPU 1 1%
1 211.143.*.* iserver1 3 2010-8-13 0:00:00 1 陈** 1 CPU 13 0%
1 211.143.*.* iserver1 3 2010-8-13 0:00:00 1 陈** 1 CPU 25 0%
1 211.143.*.* iserver1 3 2010-8-13 0:00:00 1 陈** 2 MEM 2 1.24GB
1 211.143.*.* iserver1 3 2010-8-13 0:00:00 1 陈** 2 MEM 14 1.28GB
1 211.143.*.* iserver1 3 2010-8-13 0:00:00 1 陈** 2 MEM 26 1.30GB
1 211.143.*.* iserver1 3 2010-8-13 0:00:00 1 陈** 3 HDD 3 4.3G/3G
1 211.143.*.* iserver1 3 2010-8-13 0:00:00 1 陈** 3 HDD 15 4.4G/4G
1 211.143.*.* iserver1 3 2010-8-13 0:00:00 1 陈** 3 HDD 27 4.4G/3G
2 211.143.*.* iserver2 4 2010-8-11 0:00:00 1 陈** 4 CPU 4 0%
2 211.143.*.* iserver2 4 2010-8-11 0:00:00 1 陈** 4 CPU 16 0%
2 211.143.*.* iserver2 4 2010-8-11 0:00:00 1 陈** 4 CPU 28 0%
而实际上我需要的数据只需要
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 1 CPU 1 1%
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 2 MEM 2 1.24GB
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 3 HDD 3 4.3G/3G
1 211.143.*.* iserver1 2 2010-8-12 0:00:00 1 陈** 1 CPU 1 1%
1 211.143.*.* iserver1 2 2010-8-12 0:00:00 1 陈** 2 MEM 2 1.24GB
1 211.143.*.* iserver1 2 2010-8-12 0:00:00 1 陈** 3 HDD 3 4.3G/3G
1 211.143.*.* iserver1 3 2010-8-13 0:00:00 1 陈** 1 CPU 1 1%
1 211.143.*.* iserver1 3 2010-8-13 0:00:00 1 陈** 2 MEM 2 1.24GB
1 211.143.*.* iserver1 3 2010-8-13 0:00:00 1 陈** 3 HDD 3 4.3G/3G
2 211.143.*.* iserver2 4 2010-8-11 0:00:00 1 陈** 4 CPU 4 0%
2 211.143.*.* iserver2 4 2010-8-11 0:00:00 1 陈** 4 CPU 16 0%
…… ……
………………
请我我语句要怎么改?

C# code
 var serverSources = (from s in ddc.Servers           join sou in ddc.Sources on s.server_id equals sou.server_id           join ss in ddc.SourceStates on sou.source_id equals ss.source_id           join d in ddc.DateTimes on s.server_id equals d.server_id                      join u in ddc.Users on d.use_id equals u.use_id           select new            {            s.server_id,            s.server_ip,            s.server_name,            d.dt_id,            d.dt_time,            d.dt_sourceRemark,            u.use_id,            u.usd_name,            sou.source_id,            sou.source_name,            ss.sourceState_id,            ss.sourceState_state           });



------解决方案--------------------


var serverSources = (from s in ddc.Servers
join sou in ddc.Sources on s.server_id equals sou.server_id
join ss in ddc.SourceStates on sou.source_id equals ss.source_id
join d in ddc.DateTimes on s.server_id equals d.server_id
join u in ddc.Users on d.use_id equals u.use_id
select new
{
s.server_id,
s.server_ip,
s.server_name,
d.dt_id,
d.dt_time,
d.dt_sourceRemark,
u.use_id,
u.usd_name,
sou.source_id,
sou.source_name,
ss.sourceState_id,
ss.sourceState_state
}).Distinct();
在最后加上Distinct()方法就行了


[解决办法]
因为不了解你的表结构,目前只能写成这样。

C# code
var res = (from s in ddc.Servers           join s in ddc.Sources   on s.server_id equals s.server_id           join d in ddc.DateTimes on s.server_id equals d.server_id                      join u in ddc.Users     on d.use_id    equals u.use_id           select new            {              s.server_id,              s.server_ip,              s.server_name,              d.dt_id,              d.dt_time,              d.dt_sourceRemark,              u.use_id,              u.usd_name,              sou.source_id,              sou.source_name,           }).Distinct();var re = from r in res         join s in ddc.SourceStates on r.source_id equals s.source_id         select new{             r.*,             s.sourceState_id,             s.sourceState_state         }
[解决办法]
首先,我要说的是,兄弟你的LINQ写的很牛!至少可以肯定你对在LINQ to SQL中进行链接表查询还是很有研究的。^_^
回正题……
我抱着极其认真的态度仔细对比了你现在所查询到的数据,和你想要查询到的数据。对比之后的结果是这样的,我摘录一小段吧:
下面这是你目前查询到的数据:
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 1 CPU 1 1%
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 1 CPU 13 0%
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 1 CPU 25 0%
下面是你想要查询的数据:
1 211.143.*.* iserver1 1 2010-8-11 0:00:00 1 陈** 1 CPU 1 1%
这两个的区别在于,前者将CPU的3个百分比都返回给结果集,而你想要的知识返回一个CPU百分比。以上面的例子就是在11%、13%、25%之间选择11%。
至于你为什么这样选择我就不清楚了。但是,如果我的观察使正确的,果然如此的话,那么你的问题就不是如何进行链接表查询的问题,而是如何进行过滤的问题。因此只要你添加Where()子句对数据进行过滤你想要实现的结果,一定就会实现的。

最后,稍微说一下,你这个链接表查询语句是非常恐怖的。首先,你链接的表很多,其次,如果你表中的数据非常非常多的时候,那就更恐怖,最后,LINQ to SQL在进行链接表查询的时候所产生的重复字段和数据会吓的让你出一身冷汗。那个增长的速度是足以让人目瞪口呆的!

读书人网 >.NET

热点推荐