具体的VB Linq查询帮助

时间:2009-10-15 21:50:25

标签: vb.net linq linq-to-sql

我还是LINQ的新手,我已经花了好几天的时间来解决这个问题,并准备在这个问题上屈服于无知。

我需要: 连接3个表(总共2个数据库)。让我们打电话给他们 表格1 表2 表3

Table1连接到“org”

上的Table2

结果在“emplid”

上加入Table3

过滤器(在哪里):

Table3.success = true

Table3.appcode =“neo”

Table1.empl_rcd = 0

start_date(我可以作为变量传入的那个)

end_date(我可以作为变量传入的一个)

分组:(我认为分组是你怎么做的?)

联合表的形式必须只选择每个“emplid”分组的最早(最远的)“戳记”日期字段(最初在表3上的“标记”,最初在表3和表1上的“emplid”)

从联合表中只能为每个“emplid”分组选择最新的(最新的)“effdt”日期字段(“effdt”最初在Table1上,“emplid”最初在Table3和Table1上)

选择

我需要从之前的逻辑中选择所有返回的行。我可以弄清楚如何过滤我需要的最后一行。

这是我要执行的最后一件事,它可能会让你知道我在做什么:

query = (From j In db.table1s _
Join a In db.table3s _
On j.EMPLID Equals a.emplid _
Join d In db.table2s _
On d.ORG Equals j.Org _
Where a.appcode = "neo" _
Where a.success = True _
Select a.appcode, j.effdt, a.stamp, j.EMPLID, _
d.ORGANIZATION_DESCRIPTION, d.DEPARTMENT_DESCRIPTION, d.VP_DESCRIPTION, _
a.success _
Distinct).AsQueryable().AsEnumerable()

如果你能帮我这么做,我会给你信任。但如果你能做下一件事,在我给出信用之前,我会给予 信用。

然后在那个结果中我需要为每个“组织”返回一个唯一的“emplid”计数。所以最终结果如下:

   org    |     count    |   (other columns)
------------------------------------------------
 12345    |     15       |       etc...
 54321    |     7        |       etc...

感谢帮助一个菜鸟。

2 个答案:

答案 0 :(得分:0)

您的各种EmplId分组要求与计算员工的关系并不十分清楚,但这应该可以帮助您入门:

query = From j In db.table1s _
        Join a In db.table3s On j.EMPLID Equals a.emplid _
        Join d In db.table2s On d.ORG Equals j.Org _
        Where a.appcode = "neo" _
        Where a.success = True _
        Group By j.Org, d.ORGANIZATION_DESCRIPTION Into Count()

VB Group By on MSDN

答案 1 :(得分:0)

我最终使用了这个查询,这可能不是最有效的,但它确实有效。我最大的问题是我不知道如何正确地进行子查询。

query = From final In _
        (From subfinal In _
            (From countdata In _
                (From a In _
                    (From aa In db.table3s _
                    Where aa.appcode = "neo" _
                    Where aa.success = True _
                    Group By aa.emplid Into Group _
                    Select emplid = Group.Min(Function(f) f.emplid), _
                           stampMin = Group.Min(Function(o) o.stamp) _
                    ) _
                Join j In _
                    (From jj In db.table1s _
                    Where jj.empl_rcd = 0 _
                    Group By jj.EMPLID Into Group _
                    Select EMPLID = Group.Max(Function(m) m.EMPLID), _
                        EffDate = Group.Max(Function(z) z.effdt) _
                    ) _
                On j.EMPLID Equals a.emplid _
                Join jorg In _
                    (From jj2 In db.table1s _
                    Where jj2.empl_rcd = 0 _
                    Select jj2.EMPLID, jj2.Org, jj2.effdt _
                    ) _
                On j.EMPLID Equals jorg.EMPLID _
                And j.EffDate Equals jorg.effdt _
                Select j.EMPLID, a.stampMin, j.EffDate, jorg.Org _
                Distinct) _
            Where countdata.stampMin < EndDate _
            And countdata.stampMin > StartDate _
            Group By countdata.Org Into Group _
            Select count = Group.Count, Org = Org _
            ) _
        Select subfinal.Org, subfinal.count _
        ) _
        Join d In _
            (From dd In db.table2s _
            Select dd.ORG, dd.ORGANIZATION_DESCRIPTION, dd.DEPARTMENT_DESCRIPTION, _
                    dd.VP_COLLEGE_DESCRIPTION _
            ) _
        On final.Org Equals d.ORG _
    Select final.count, final.Org, Org_desc = d.ORGANIZATION_DESCRIPTION, _
    Dept_descr = d.DEPARTMENT_DESCRIPTION, Coll_descr = d.VP_COLLEGE_DESCRIPTION

希望这有助于其他人...