【问题标题】:LINQ query with List<> and asking if is null使用 List<> 进行 LINQ 查询并询问是否为空
【发布时间】:2012-07-03 15:10:59
【问题描述】:

我有一些 linq 查询的方法。接下来是逻辑,如果我为角色 id 列表传递 null,我希望所有角色都包含在进程中,但如果它有值,我只想要列表中具有 id 的角色。我收到了例外。

public static List<NameEmail> GetNameEmailPairs(Guid guid, List<int> recipientRoles)
        {
            using (var tc = TransactionContext())
            {
                var dc = tc.DataContext;

                var nameEmailPairs = (
                                 from email in dc.Emails
                                 join logon in dc.Logons on email.GUID equals logon.GUID                                     
                                 join eLogon in dc.ELogons on logon.UID equals eLogon.LogonGUID                         
                                 join role in dc.Roles on entityLogon.PrimaryPermissionRoleID equals role.RoleID
                                 where
                                     (recipientRoles == null || recipientRoles.Contains(role.RoleID))

                                 select new NameEmail
                                            {
                                                Email = email.EmailAddress,
                                                FullName = GetName(logon.GUID)
                                            } 
                             )
                    .ToList();
                return nameEmailPairs;
            }
        }

这部分正在破坏(recipientRoles == null || recipientRoles.Contains(role.RoleID))。你能帮我解决这个问题吗,我该怎么办?

【问题讨论】:

  • 你到底收到了什么异常?
  • System.ArgumentNullException:值不能为空。参数名称:source at System.Linq.Enumerable.OfType[TResult](IEnumerable source)
  • 当“recipientRoles”参数为空时出现此异常。

标签: c# .net linq linq-to-sql generic-list


【解决方案1】:

为了使调试更容易,请将您的查询分成如下几部分:

var nameEmailPairs = (
  from email in dc.Emails
  join logon in dc.Logons on email.GUID equals logon.GUID                                     
  join eLogon in dc.ELogons on logon.UID equals eLogon.LogonGUID                         
  join role in dc.Roles on entityLogon.PrimaryPermissionRoleID equals role.RoleID
  select new {email, role}
);

if(recipientRoles != null)
{
    nameEmailPairs = nameEmailPairse.Where(
        recipientRoles.Contains(p => p.role.RoleID)
    );
}

var nameEmailPairs = (from p in nameEmailPairs
                     select new NameEmail
                                {
                                  Email = email.EmailAddress,
                                  FullName = GetName(logon.GUID)
                                }).ToList();

【讨论】:

  • 不仅用于调试。这是用依赖于变量存在的条件扩展 linq 查询的 方法。它还解决了 ArgumentNullException。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多