LINQ查询中的默认值

时间:2011-05-18 16:46:11

标签: asp.net linq

我在MVC3应用程序中遵循Linq查询/功能。

public AuditTrail GetNamesAddressesEmployers(long registryId , int changedField) {
    var otherNameAndAddress = (from a in context.AuditTrails
                               where a.ChangedField == changedField
                                  && a.RegistryId == registryId
                               select a).FirstOrDefault();
    return otherNameAndAddress;   
} 

我希望如果otherNameAndAddress = null,那么应该为其属性分配一些值。

otherNameAndAddress具有名称和描述属性。这个GetNamesAddressesEmployers正在3个地方使用。我想在所有三个位置的otherNameAndAddress = null时为名称和描述分配不同的值。

2 个答案:

答案 0 :(得分:4)

您已经在使用FirstOrDefault(),所以为什么不指定默认值:

public AuditTrail GetNamesAddressesEmployers(long registryId, int changedField)
{
    return context.AuditTrails            
        .Where(a => a.ChangedField == changedField 
             && a.RegistryId == registryId)
        .DefaultIfEmpty(new AuditTrail { /* fill properties here */ })
        .FirstOrDefault();
}

答案 1 :(得分:1)

好吧,您可以将return语句更改为:

return otherNameAndAddress ?? new AuditTrail { Name = "Default",
                                               Description = "Default };

或类似的东西......但是你说你想为不同的电话分配不同的默认值。这意味着您需要传递默认值,或者在呼叫站点执行默认(例如,以相同的方式,通过空合并运算符)。

例如:

public AuditTrail GetNamesAddressesEmployers(long registryId, int changedField,
                                             AuditField defaultValue) {
    var otherNameAndAddress = (from a in context.AuditTrails
                               where a.ChangedField == changedField
                                  && a.RegistryId == registryId
                               select a).FirstOrDefault();
    return otherNameAndAddress && defaultValue; 
}

保持现有状态,并在通话网站上使用此功能:

var auditTrail = GetNamesAddressesEmployers(registryId, changedField) ??
                 new AuditTrail { Name = "Foo", Description = "Bar" };

根据您的描述,哪个是最好的并不是很清楚。

编辑:正如贾斯汀所说,你可以使用DefaultIfEmpty代替FirstOrDefault之前。这意味着你拥有来传递价值,而不是在呼叫网站上传递价值,但除此之外,它们是非常相似的解决方案。