2011-05-18 49 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