我在使用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”异常。
通过查找该异常,我猜测原因是因为AccountConnection都具有字段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();

10-06 14:39
查看更多