使用Linq中的查询过滤最可靠的数据源

时间:2012-12-10 08:17:28

标签: c# asp.net linq

我使用Linq相当新,对于我来说,从c#datatable过滤最佳数据源对我来说有点棘手。我需要对数据表执行以下过滤。数据背后的背景是它是一组记录,其包含来自不同数据源的独立冗余以用于故障保护。如果一个数据源在某些时候已损坏,则辅助或第三个数据源将成为该事件线程的主要来源。

原始数据(例如): signintable:

source  First       Last
d1      John        Smith
d1      John        Smith
d3      John        Smith
d1      Jane        Doe
d2      Jane        Doe
d3      Richard     Miles
d3      Richard     Miles
d1      Richard     Miles

我想在此添加两列:按(firstname,lastname和datasource)分组的唯一成员数,以及基于不同组(firstname,lastname,datasource)的uniqueRecordGroupnumber,但是按照该数据源的顺序排序特别是名字姓氏拥有最多的记录,至少。

source  First   Last    Count   UniqueRecordGroup
d1      John    Smith   2       1
d1      John    Smith   2       1
d3      John    Smith   1       2
d1      Jane    Doe     1       1
d2      Jane    Doe     1       2
d3      Richard Miles   2       1
d3      Richard Miles   2       1
d1      Richard Miles   1       2

然后我最终只过滤掉主要(唯一记录组1),以消除该特定记录的冗余/不太可靠的数据源。

source  First   Last    Count   UniqueRecordGroup
d1      John    Smith   2       1
d1      John    Smith   2       1
d1      Jane    Doe     1       1
d3      Richard Miles   2       1
d3      Richard Miles   2       1

如何在数据表上使用Linq完成上述步骤(例如数据表可签名)?

谢谢。

1 个答案:

答案 0 :(得分:0)

现在完成此应用程序功能后,我不建议尝试使用Linq来实现此目的。我发现没有太多资源和论坛明确地涉及更多涉及Linq查询,而对于Oracle或SQL,至少在需要的部分上有大量论坛和帖子。因此,我不是在Linq脚本的c#/ asp.net图层中添加该功能,而是将其添加到数据库查询图层中。

在Oracle中,我完成了以上4个步骤:

--1.  creating a derived table of unique instances of main data (a): (First, Last) and a count of instances in the main table:

b As
(select First, Last, source, COUNT(*) distinctpersoncount
From a
GROUP BY First, Last, source)

--2.  Rank the fills from greatest to least.

c As
(select b.*, row_number() over(partition by  First, Last
order by distinctpersoncount desc) as distinctpersonrowid
from b


--3.  combine the new distinctperson columns into a joined table with the original data a.

d As
(select a.*, c.distinctpersoncount, c.distinctpersonrowid
from a
left join c
on
.... (join conditions here)

--4.  select all the data in d, filtering by distinctpersonrowid = 1 (the best source).