#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’