У меня есть класс, как этотВозвращение результата из запроса Linq, но с одним значением модифицирована
public class Product
{
public int Id {get;set;}
public string Name {get;set;}
public Category Category {get;set;}
}
Теперь я хочу, чтобы запросить список с Linq
var result = from p in products
select p;
То, что я хочу для того чтобы достигнуть это что в результате будет задана категория по умолчанию, если она пуста.
Что я могу сделать, это
var result = from p in products
select new Product()
{
Id = p.Id,
Name = p.Name,
Category = p.Category ?? new Category()
}
но требует от меня, чтобы установить все поля снова. Но это не то, что я хочу, потому что у моего объекта реального мира есть около 50 свойств, а не 3, и мне также нужно обновить код. Если я добавлю еще одно свойство в будущем. То, что я имею в виду что-то больше, как это:
var result = from p in products
select p { Category = p.Category ?? new Category() };
но не компилируется.
, как я хотел бы сделать при построении продукта:
var product = new Product() { Category = new Category() };
Я знаю, что я мог бы просто сделать это:
foreach (var p in result)
{
if(p.Category == null)
p.Category = new Category();
}
, но я передаю результат вызывающему абоненту я не хочу чтобы повторить мои продукты в этот момент.
Почему не инициализируются свойства в первую очередь? Если у продукта должна быть хотя бы категория, инициализированная конструктором по умолчанию, необходимо соответствующим образом инициализировать поле поддержки. –
Если вы работаете с ORM в качестве источника данных, это может привести к непреднамеренному включению новых категорий в базу данных. –
Этого не произойдет. В настоящее время я использую подход 'select new Product ...' и переназначаю каждое свойство. С недостатком, что я должен модифицировать код каждый раз, когда я добавляю другое свойство в свой класс. Это опасно. Я никогда не буду хранить результат, и даже если бы я попытался, у моей модели была '[MinLength (5)]' dataannotation на category.name, поэтому она все равно потерпит неудачу. –