开发者

default values in LINQ query

开发者 https://www.devze.com 2023-03-07 05:52 出处:网络
I have following Linq query/function in my MVC3 application. public AuditTrail GetNamesAddressesEmployers(long registryId , int changedField) {

I have following Linq query/function in my MVC3 application.

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

I want that if otherNameAndAddress = null then its properties should be assigned some values.

otherNameAndAddress has Name and description property. This GetNamesAddressesEmployers is being used at 3 places. I want to assign different values to name and description when otherNameAndAddress = null at all three locations开发者_运维百科.


You're already using FirstOrDefault() so why not specify the Default:

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


Well, you could change the return statement to:

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

or something like that... but you say you want to assign different default values for different calls. That means you'll either need to pass the default in, or perform the defaulting (e.g. in the same way, via the null-coalescing operator) at the call site.

For example:

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

or keep it as it currently is, and use this at the call site:

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

It's not really clear which is best based on your description.

EDIT: As mentioned by Justin, you could use DefaultIfEmpty instead (just before FirstOrDefault). That means you have to pass the value in rather than doing it at the call site, but other than that they're very similar solutions.

0

精彩评论

暂无评论...
验证码 换一张
取 消