【发布时间】:2018-01-05 20:18:04
【问题描述】:
我将两个参数传递给一个方法,一个帐号或一个组织编号。一次只有一个参数可以有一个值。意思是,如果我传入一个帐号,则组织编号为空。反之亦然。
目前,我正在尝试对与个人或组织关联的一组帐户进行排序。我将与实体直接相关的帐户进行排序,然后对其进行排序。
// Accounts entity is directly involved with
mainAccounts = accounts
.Where(acct => ((acct.PrimaryPersonNumber.HasValue) ? acct.PrimaryPersonNumber : acct.PrimaryOrganizationNumber) == entityNumber)
.OrderBy(acct => acct.AccountNumber);
然后我查看附加到每个实体的RoleCode 变量以对其进行排序。
我遇到的问题是试图将这两个查询合并为一个,有点像我对第一个查询所做的。
if (persNbr.HasValue)
{
// Accounts Person takes a role in
secondaryAccounts = accounts
.Where(acct => acct.PrimaryPersonNumber != entityNumber)
.OrderBy(acct => acct.PersonRoles
.Where(role => role.PersNbr == entityNumber)
.Select(role => role.RoleOrder).Min())
.ThenBy(acct => acct.AccountNumber);
}
else
{
// Accounts Organization takes a role in
secondaryAccounts = accounts
.Where(acct => acct.PrimaryOrganizationNumber != entityNumber)
.OrderBy(acct => acct.OrganizationRoles
.Where(role => role.OrgNbr == entityNumber)
.Select(role => role.RoleOrder).Min())
.ThenBy(acct => acct.AccountNumber);
我尝试关注,但 C# 智能感知抱怨该对象(acct.PersonRoles 或 acct.OrganizationRoles)不存在,并且直到运行时才会存在。
secondaryAccounts = accounts
.Where(acct => ((acct.PrimaryPersonNumber.HasValue) ? acct.PrimaryPersonNumber : acct.PrimaryOrganizationNumber) != entityNumber)
.OrderBy(acct => ((acct.PrimaryPersonNumber.HasValue) ? acct.PersonRoles : acct.OrganizationRoles) // <-- Intellisense can't get past this line
.Where(role => ((acct.PrimaryPersonNumber.HasValue) ? role.PersNbr : role.OrgNbr) == entityNumber)
.Select(role => role.RoleOrder).Min())
.ThenBy(acct => acct.AccountNumber);
我该怎么做?
如果有帮助,这是我的方法。
private Account[] SortAccountsOnPersonRoles(Account[] accounts, long? persNbr, long? orgNbr)
{
IEnumerable<Account> mainAccounts;
IEnumerable<Account> secondaryAccounts;
long entityNumber = (long)((persNbr.HasValue) ? persNbr : orgNbr);
// Accounts entity is directly involved with
mainAccounts = accounts
.Where(acct => ((acct.PrimaryPersonNumber.HasValue) ? acct.PrimaryPersonNumber : acct.PrimaryOrganizationNumber )== entityNumber)
.OrderBy(acct => acct.AccountNumber);
if (persNbr.HasValue)
{
// Accounts Person takes a role in
secondaryAccounts = accounts
.Where(acct => acct.PrimaryPersonNumber != entityNumber)
.OrderBy(acct => acct.PersonRoles
.Where(role => role.PersNbr == entityNumber)
.Select(role => role.RoleOrder).Min())
.ThenBy(acct => acct.AccountNumber);
}
else
{
// Accounts Organization takes a role in
secondaryAccounts = accounts
.Where(acct => acct.PrimaryOrganizationNumber != entityNumber)
.OrderBy(acct => acct.OrganizationRoles
.Where(role => role.OrgNbr == entityNumber)
.Select(role => role.RoleOrder).Min())
.ThenBy(acct => acct.AccountNumber);
}
return mainAccounts.Concat(secondaryAccounts).ToArray();
}
编辑: Intellisense 的错误说:
无法确定条件表达式的类型,因为 PersonRoles[] 和 OrganizationRoles[] 之间没有隐式转换
这是因为我尝试了以下语句:
.OrderBy(acct => ((acct.PrimaryPersonNumber.HasValue) ? acct.PersonRoles : acct.OrganizationRoles) // <-- Intellisense can't get past this line
.Where(role => ((acct.PrimaryPersonNumber.HasValue) ? role.PersNbr : role.OrgNbr) == entityNumber)
Intellisense 无法确定 lamda 变量的值来执行 LINQ 查询 .Where()。具体来说,
acct => ((acct.PrimaryPersonNumber.HasValue) ? acct.PersonRoles : acct.OrganizationRoles)
【问题讨论】:
-
你能发布你从智能感知得到的确切错误信息吗?
-
您不能从同一个 LINQ 表达式返回
PersonRoles或OrganizationRoles,因为它们是不同的类型。这由于它们是数组而变得更加复杂,这意味着即使这两种类型是公共类型层次结构的一部分,也不容易为在不同情况下可能返回一个或另一个的表达式获得一致的返回类型. -
@AaronM.Eshbach 是的,我想我可以使用他们的基类,但它会变得太复杂。
标签: c# .net linq sorting intellisense