2013-05-24 2 views
2

У меня есть класс, как этотВозвращение результата из запроса 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(); 
} 

, но я передаю результат вызывающему абоненту я не хочу чтобы повторить мои продукты в этот момент.

+1

Почему не инициализируются свойства в первую очередь? Если у продукта должна быть хотя бы категория, инициализированная конструктором по умолчанию, необходимо соответствующим образом инициализировать поле поддержки. –

+0

Если вы работаете с ORM в качестве источника данных, это может привести к непреднамеренному включению новых категорий в базу данных. –

+0

Этого не произойдет. В настоящее время я использую подход 'select new Product ...' и переназначаю каждое свойство. С недостатком, что я должен модифицировать код каждый раз, когда я добавляю другое свойство в свой класс. Это опасно. Я никогда не буду хранить результат, и даже если бы я попытался, у моей модели была '[MinLength (5)]' dataannotation на category.name, поэтому она все равно потерпит неудачу. –

ответ

2

Я бы не рекомендовал это делать в Linq. Вы смешиваете бизнес-логику (нулевые значения должны быть инициализированы по умолчанию) с кодом DataAcess (получить мои продукты).

Не можете ли вы изменить свой класс продукта. Измените свойство «Категория» на что-то вроде.

private Category _category 

public Category Category 
{ 
    get 
    { 
     if (_category == null) 
      _category = new Category(); 

     return _category; 
    } 
    set 
    { 
     _category = value; 
    } 
} 
Смежные вопросы