我在使用LINQ查询时遇到了一些麻烦。
该查询根据存储库中的条目创建新对象的列表。
这是原始查询:
var accounts = (from a in entityRepository.Queryable<Account>()
from l in a.ExternalLogins
select new
{
a.ID,
FullName = a.FirstName + " " + a.LastName,
Status = a.Status == AccountStatus.Closed ? Enums.Status.Inactive : Enums.Status.Active,
Login = new
{
ConnectionID = l.Connection.ID,
l.Connection.ConnectionType,
l.Identity
},
a.AdminAccess,
a.Username,
a.Email
}).ToList();
我的问题是,并非所有
a
都有a.ExternalLogins
。该查询没有拉那些帐户,因为语句from l in a.ExternalLogins
中有其他帐户。我尝试将查询修改为: var accounts = (from a in entityRepository.Queryable<Account>()
select new
{
a.ID,
FullName = a.FirstName + " " + a.LastName,
Status = a.Status == AccountStatus.Closed ? Enums.Status.Inactive : Enums.Status.Active,
Login = (from l in a.ExternalLogins
select new
{
ConnectionID = l.Connection.ID,
l.Connection.ConnectionType,
l.Identity
}),
a.AdminAccess,
a.Username,
a.Email
}).ToList();
但是我收到了“ System.Reflection.AmbiguousMatchException”异常。
通过查找该异常,我猜测原因是因为
Account
和Connection
都具有字段ID
。我是否正朝着正确的方向前进?我要追查此异常,还是查询不正确?
如果这很简单,我深表歉意。我是LINQ查询的新手,而我的Google技能在这一点上使我失败了!
最佳答案
要在Linq中进行左外部联接,请添加一个DefaultIfEmpty()
调用并检查结果是否为null:
var accounts = (from a in entityRepository.Queryable<Account>()
from l in a.ExternalLogins.DefaultIfEmpty()
select new
{
a.ID,
FullName = a.FirstName + " " + a.LastName,
Status = a.Status == AccountStatus.Closed ? Enums.Status.Inactive : Enums.Status.Active,
Login = (l == null) ? null : new
{
ConnectionID = l.Connection.ID,
l.Connection.ConnectionType,
l.Identity
},
a.AdminAccess,
a.Username,
a.Email
}).ToList();