Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net LINQ查询中的默认值_Asp.net_Linq - Fatal编程技术网

Asp.net LINQ查询中的默认值

Asp.net LINQ查询中的默认值,asp.net,linq,Asp.net,Linq,我的MVC3应用程序中有以下Linq查询/函数 public AuditTrail GetNamesAddressesEmployers(long registryId , int changedField) { var otherNameAndAddress = (from a in context.AuditTrails where a.ChangedField == changedField

我的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;   
} 
我希望如果othernameanddress=null,那么应该为其属性分配一些值


OtherName和Address具有Name和description属性。此GetNamesAddressesEmployers用于3个位置。当OtherName和Address在所有三个位置都为null时,我想为name和description分配不同的值。

那么,您可以将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" };
根据你的描述,不太清楚哪一个是最好的


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

您已经在使用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();
}

出于好奇,为什么要使用DefaultIfEmpty指定默认值,然后简单地让FirstOrDefault完成它的工作?我过去都用过这两种方法,而且这两种方法都会引起同事的讨论。@Justin:我总是忘记DefaultIfEmpty允许指定值。很遗憾FirstOrDefault没有。不过,老实说,我认为这两种方式都不太清楚。@Jon-我当然同意。将默认值作为参数传递给FirstOrDefault对我来说肯定是最有意义的。@Justin:我想没有什么可以阻止您添加自己的扩展方法,它只返回
DefaultIfEmpty(defaultValue)。FirstOrDefault()
:)@jon我希望分配不同的默认值,因此我尝试使用您的第二个解决方案,但我遇到了错误:运算符“&&”不能应用于“myproj.Models.AuditTrail”和“myproj.Models.AuditTrail”类型的操作数。我想您希望将DefaultIfEmpty调用放在Where之后,是吗?这本身就表明了不使用这种方法的一个潜在原因——它显然容易出错:)