我使用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完成上述步骤(例如数据表可签名)?
谢谢。
答案 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).