我试图在一个List的linq中使用null进行左外连接,所以如果我有一个列表{1,2,3,4}而另一个列表有{1,2,3,5},我想要{4}。
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!
答案 0 :(得分:2)
试
AlertId = b.AlertId ?? a.AlertId ?? Guid.Empty;
因为b可以是null
,你无法将其与Guid.Empty
??
是null-coalescing运算符。这意味着该语句将使用第一个非null值进行赋值。
// 编辑:
你是对的。我没有测试它。
AlertId = ( b == null ) ? a.AlertId : Guid.Empty;
这应该有效。 Guid是一个特例,因为它不能因设计而无效。