左外连接,带有Guids的null LINQ异常

时间:2012-12-18 13:01:12

标签: c# linq entity-framework guid

我试图在一个List的linq中使用null进行左外连接,所以如果我有一个列表{1,2,3,4}而另一个列表有{1,2,3,5},我想要{4}。

enter image description here

IEnumerable<AlertChangeSet> listToClear = from a in AlertsCached
                                                  join b in loadedAlerts on a.AlertId equals b.AlertId into c
                                                  from b in c.DefaultIfEmpty()
                                                  select new AlertChangeSet()
                                                       {
                                                           AlertId = b.AlertId == Guid.Empty ? a.AlertId : Guid.Empty

                                                       };
  if (listToClear.Any())
        {
            foreach (AlertChangeSet alertChangeSet in listToClear)
            {
                Guid a = alertChangeSet.AlertId;
                //SystemMonitoringService.ClearAlertAsync(alertChangeSet.AlertId.ToString(), null);
            }
        }

当我运行此代码时,我得到了这个例外:

  

测试方法   Tgw.Systems.Alerting.Server.Test.ConfigurationTests.UpdateCacheWith2recordsSameIdWorking   抛出异常:System.NullReferenceException:对象引用没有   设置为对象的实例。在   Tgw.Wcs.Alerting.MonitoringAddIn.Oms.Wcf.OmsWcfSystemMonitor.b__c(&lt;&gt; f__AnonymousType0 2 <>h__TransparentIdentifier2, AlertChangeSet b) in OmsWcfSystemMonitor.cs: line 255 at System.Linq.Enumerable.<SelectManyIterator>d__31 3.MoveNext()at at   Tgw.Wcs.Alerting.MonitoringAddIn.Oms.Wcf.OmsWcfSystemMonitor.UpdateAlertsFromCache(IList`1   在OmsWcfSystemMonitor.cs中的loadedAlerts):第275行   Tgw.Systems.Alerting.Server.Test.ConfigurationTests.UpdateCacheWith2recordsSameIdWorking()   在ConfigurationTests.ServerCoreTests.cs中:第243行

我认为问题在于Guid!

1 个答案:

答案 0 :(得分:2)

AlertId = b.AlertId ?? a.AlertId ?? Guid.Empty;

因为b可以是null,你无法将其与Guid.Empty

进行比较

??是null-coalescing运算符。这意味着该语句将使用第一个非null值进行赋值。

// 编辑

你是对的。我没有测试它。

AlertId = ( b == null ) ? a.AlertId : Guid.Empty;

这应该有效。 Guid是一个特例,因为它不能因设计而无效。