LINQ查询中的默认值

4
我在我的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个回答

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();
}

我认为你想在Where之后放置DefaultIfEmpty调用,是吗?这本身就表明了不使用此方法的潜在原因 - 它显然容易出错 :) - Jon Skeet

1

好的,你可以将返回语句改为:

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" };

根据您的描述,很难确定哪个是最好的。

编辑:正如Justin所提到的,您可以在FirstOrDefault之前使用DefaultIfEmpty。这意味着您必须传递值而不是在调用站点上执行它,但除此之外,它们是非常相似的解决方案。


只是出于好奇,为什么你会选择这种方式而不是使用DefaultIfEmpty指定默认值,然后让FirstOrDefault完成它的工作呢?我过去曾经使用过两种方法,但无论哪种方式都会引起与我的同事们的讨论。 - Justin Niessner
@Justin:我总是忘记DefaultIfEmpty允许指定一个值。遗憾的是,FirstOrDefault没有这个功能。不过,说实话,我认为两种方式都不太清晰。 - Jon Skeet
@Jon - 我完全同意。将默认值作为参数传递给FirstOrDefault肯定对我来说是最有意义的。 - Justin Niessner
@Justin:我想没有什么能阻止你添加自己的扩展方法,它只返回 DefaultIfEmpty(defaultValue).FirstOrDefault() :) - Jon Skeet
@jon 我想分配不同的默认值,所以我尝试使用您的第二个解决方案,但是我遇到了错误:运算符“&&”不能应用于类型为“myproj.Models.AuditTrail”和“myproj.Models.AuditTrail”的操作数。 - DotnetSparrow
@DotnetSparrow:抱歉,那个 && 应该是一个 ??。现在已经在答案中修复了。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接