使用具有内联函数的LINQ查询 - 按功能排序

时间:2014-04-08 20:07:54

标签: vb.net winforms linq combobox datasource

我正在尝试设置LINQ查询以用作组合框数据源。组合框是DisplayMember的简单名称列表和ValueMember的PeopleID。

问题是该名称可能是First Last或Last,First格式。我有一个GetFullName(intPeopleID)函数来返回正确的名称序列。组合框名称必须以字母顺序排序,因此需要在第一个查询获得全名后进行排序。

Dim LQBackupOriginalA = From a In DCAppMain.tblPeopleMain
        Where a.BusinessGroupID = intBusinessGroupID
        Select Person = PP.GetFullName(a.PeopleID), a.PeopleID

Dim LQBackupOriginalB = From b In LQBackupOriginalA
    Order By b.Person
    Select b.Person, b.PeopleID

cboBackupOriginal.DataSource = LQBackupOriginalA
cboBackupOriginal.DisplayMember = "Person"
cboBackupOriginal.ValueMember = "PeopleID"

这不起作用,因为函数'GetFullName'不会转换为SQL - 当然。我尝试了很多变化但没有成功。

我可以先将第一个查询中的数据附加到本地表中,然后在设置组合框的数据源之前使用查询对其进行排序。但我想知道是否有更简单的事情?

2 个答案:

答案 0 :(得分:0)

您应该只能过滤所需的行,将查询转换为可枚举,然后在内存中执行GetFullName部分。我的VB缺乏,但类似于此;

Dim LQBackupOriginalA = (
    From a In DCAppMain.tblPeopleMain
    Where a.BusinessGroupID = intBusinessGroupID
    Select a.PeopleID).
         AsEnumerable().
         Select(Function(peopleId) New With {
            Key .Person = PP.GetFullName(peopleId), .PeopleID = peopleId
         })

...或在C#中,我确定语法;

var LQBackupOriginalA = 
    DCAppMain.tblPeopleMain
        .Where(a => a.BusinessGroupID == intBusinessGroupID)
        .Select(a => a.PeopleID)
        .AsEnumerable()
        .Select(peopleId => 
                  new {Person = PP.GetFullName(peopleId), PeopleID = peopleId});

答案 1 :(得分:0)

感谢Joachim - 到目前为止我还没有尝试过使用lambda函数,它们很有帮助!

这是我最终做的工作:

    '-- Get Distinct ManagerID
    Dim LQManagerOriginalA = (From a In DCAppMain.tblPeopleMain
        Where a.ManagerID IsNot Nothing And a.CurrentEmployee = True And a.UserType = "Full"
        Group By a.ManagerID Into g = Group
        Order By ManagerID
        Select New With {.ManagerID = ManagerID})

    '-- Get Ordered List of FullNames and PeopleIDs
    Dim LQManagerOriginalB = LQManagerOriginalA.[Select](Function(a) a.ManagerID).AsEnumerable().[Select](Function(a) New With {Key .Person = PP.GetFullName(a), Key .PeopleID = a}).OrderBy(Function(x) x.Person).ToList()

    '-- Apply datasource to combobox        
    RemoveHandler cboManagerOriginal.SelectedIndexChanged, AddressOf cboManagerOriginal_SelectedIndexChanged
    cboManagerOriginal.DataSource = LQManagerOriginalB
    AddHandler cboManagerOriginal.SelectedIndexChanged, AddressOf cboManagerOriginal_SelectedIndexChanged
    cboManagerOriginal.DisplayMember = "Person"
    cboManagerOriginal.ValueMember = "PeopleID"