значения по умолчанию в запросе LINQ

#asp.net #linq

#asp.net #linq

Вопрос:

У меня есть следующий запрос / функция Linq в моем приложении MVC3.

 public AuditTrail GetNamesAddressesEmployers(long registryId , int changedField) {
    var otherNameAndAddress = (from a in context.AuditTrails
                               where a.ChangedField == changedField
                                  amp;amp; a.RegistryId == registryId
                               select a).FirstOrDefault();
    return otherNameAndAddress;   
} 
  

Я хочу, чтобы, если otherNameAndAddress = null, то его свойствам должны быть присвоены некоторые значения.

otherNameAndAddress имеет свойство Name и description. Этот GetNamesAddressesEmployers используется в 3 местах. Я хочу присвоить разные значения имени и описанию, когда otherNameAndAddress = null во всех трех расположениях.

Ответ №1:

Вы уже используете FirstOrDefault(), так почему бы не указать значение по умолчанию:

 public AuditTrail GetNamesAddressesEmployers(long registryId, int changedField)
{
    return context.AuditTrails            
        .Where(a => a.ChangedField == changedField 
             amp;amp; a.RegistryId == registryId)
        .DefaultIfEmpty(new AuditTrail { /* fill properties here */ })
        .FirstOrDefault();
}
  

Комментарии:

1. Я думаю, вы хотели поместить вызов DefaultIfEmpty после Where, не так ли? Это само по себе указывает на потенциальную причину не использовать этот метод — он явно подвержен ошибкам 🙂

Ответ №2:

Ну, вы могли бы изменить оператор 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
                                  amp;amp; a.RegistryId == registryId
                               select a).FirstOrDefault();
    return otherNameAndAddress amp;amp; defaultValue; 
}
  

или оставьте его таким, как есть в данный момент, и используйте это на сайте вызова:

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

Не совсем ясно, что лучше всего использовать на основе вашего описания.

РЕДАКТИРОВАТЬ: Как упоминал Джастин, вы могли бы использовать DefaultIfEmpty вместо этого (непосредственно перед FirstOrDefault ). Это означает, что вы должны передавать значение в, а не делать это на сайте вызова, но в остальном это очень похожие решения.

Комментарии:

1. Просто из любопытства, зачем вам идти этим путем, указывая значение по умолчанию с помощью DefaultIfEmpty, а затем просто позволяя FirstOrDefault выполнять свою работу? В прошлом я использовал оба варианта, и любой из них всегда вызывает дискуссию с моими коллегами.

2. @Justin: Я всегда забываю о DefaultIfEmpty, позволяющем указывать значение. Жаль, что FirstOrDefault этого не делает. Тем не менее, я думаю, что это не намного понятнее в любом случае, если честно.

3. @Jon — Я бы, конечно, согласился. Передача значения по умолчанию в качестве параметра FirstOrDefault, безусловно, имела бы наибольший смысл для меня.

4. @Justin: Я полагаю, ничто не мешает вам добавить свой собственный метод расширения, который просто возвращает DefaultIfEmpty(defaultValue).FirstOrDefault() 🙂

5. @jon Я хочу, чтобы были назначены другие значения по умолчанию, поэтому я попытался использовать ваше второе решение, но я получаю сообщение об ошибке: оператор ‘amp;amp;’ не может быть применен к операндам типа ‘myproj. Модели. AuditTrail’ и ‘myproj. Модели. AuditTrail’