我正在尝试设置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 - 当然。我尝试了很多变化但没有成功。
我可以先将第一个查询中的数据附加到本地表中,然后在设置组合框的数据源之前使用查询对其进行排序。但我想知道是否有更简单的事情?
答案 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"