2011-05-18 86 views
4

我在我的MVC3应用程序中有以下Linq查询/函数。在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在所有三个位置时,我想为名称和描述分配不同的值。

回答

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

我想你想把DefaultIfEmpty调用*放在*之后,是不是?这本身就表明不使用这种方法的潜在原因 - 这显然是容易出错的:) – 2011-05-18 16:58:22

+0

@Jon - 先生,您是正确的。固定。 – 2011-05-18 17:00:10

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之前)。这意味着你传递的价值,而不是在呼叫站点,但除此之外,他们是非常类似的解决方案。

+0

只是出于好奇,你为什么会去了使用DefaultIfEmpty指定默认的这条路线,然后简单地让FirstOrDefault完成其工作?过去我都用过这两种方法,但无论如何都会和我的同事一起讨论。 – 2011-05-18 16:53:25

+0

@Justin:我总是忘记了DefaultIfEmpty允许指定一个值。 FirstOrDefault没有。这是一个耻辱。不过,老实说,我认为这两种方式都不太清楚。 – 2011-05-18 16:56:26

+0

@Jon - 我当然同意。将默认值作为参数传递给FirstOrDefault对我来说肯定是最有意义的。 – 2011-05-18 16:57:56