Инициализация объекта для обработки результатов нулевого запроса

#c# #linq

#c# #linq

Вопрос:

У меня есть объектная модель, подобная этой:

 public class MyObject{
  public int Prop1{get;set;}
  public int Prop2{get;set;}
}
  

Я использую этот объект в запросе linq to sql следующим образом:

 var MyQuery = from....
              where....
              select new MyObject()
                {
                  Prop1 = ...
                  Prop2 = ...
                };
  

Проблема в том, что иногда Prop1 оказывается пустым в запросе, и я получаю ошибку, потому что Prop1 равно null.

Я добавляю это в класс:

 public class MyObject{
...
public void Init()
{
  this.Prop1 = 0;
  this.Prop2 = 0;
}
  

Как мне связать инициализацию с событием «объект только что создан»?

И является ли решение проблемы null путем инициализации объекта в 0 лучшим способом сделать это в любом случае?

Спасибо за ваши предложения.

редактировать: я использую Prop1 в пользовательском интерфейсе и не могу отобразить null, должно быть 0.

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

1. Prop1 = ... ?? 0 казалось бы, проще…

2. Не зная подробностей о том, что делает MyObject, и каково назначение каждого свойства, на самом деле не может быть надежного ответа.

Ответ №1:

Вы могли бы сделать это так:

 select new MyObject()
            {
              Prop1 = prop1 ?? 0;
              Prop2 = prop2 ?? 0;
            };
  

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

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

1. ‘лучше’ зависит от последующей обработки, если последующая обработка будет обрабатывать null таким же образом, как и 0, тогда может иметь смысл преобразовать сразу, а не проводить потенциально много будущих проверок null. Как сказал @Ocelot20 в комментариях выше, это во многом зависит от того, что MyObject делает и как оно используется.

2. @forsvarir Конечно, это зависит от того, как он будет использоваться впоследствии. Я просто подумал с эстетической точки зрения — запрос LINQ должен быть максимально понятным.

3. Как я могу инициализировать объект равным 0 вместо того, чтобы выполнять инициализацию на уровне запроса? Как насчет обработчика событий?

4. @frenchie Инициализация не имеет значения, потому что вы создаете объект на основе результатов запроса. В момент создания объекта вы должны присвоить свойствам объекта допустимые значения. Поскольку свойствам не разрешается использовать значения null, единственное место, где можно исключить значения null, — это запрос при создании объекта. Я не вижу, как какой-либо обработчик событий мог бы помочь.

Ответ №2:

Два места, которые вы могли бы исправить:

  public int? Prop1{get;set;}
  

или

  select new MyObject()
            {
              Prop1 = // check for null here and put default value.
  

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

1. Я использую Prop1 в пользовательском интерфейсе и не могу отобразить null; должен быть инициализирован. Что вы думаете об обработчике событий?

2. Да, вы могли бы проверить в обработчике событий или использовать 2-й вариант.

Ответ №3:

Почему бы не использовать Nullable<int> тогда?

 public class MyObject{
  public int? Prop1{get;set;}
  public int? Prop2{get;set;}
}
  

int? является сокращением Nullable<int> . Это значит, что теперь Prop1 и Prop2 как могу быть null .

Или, если вы хотите ноль, вместо null, то сделайте это в LINQ :

 select new MyObject() { Prop1  = p1 ?? 0,  Prop2 = p2 ?? 0 }
  

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

1. хорошо, но как насчет создания обработчика событий, который автоматически устанавливает значение в 0? В пользовательском интерфейсе используется Prop1, и я не могу отобразить null.

2. @frenshie: Смотрите правку. Кстати, вы отображаете его в приложении WPF / Silverlight, тогда даже с Nullable вы можете работать. Все, что вам нужно, это написать преобразователь, который вы можете использовать и в других ситуациях.

Ответ №4:

Является ли ваш тип базы данных обнуляемым?

Если это так, вам нужно будет определить в вашем классе:

 public int? Prop1 { get; set; }
  

или преобразуйте тип вашей базы данных в int using Convert.ToInt32(databseField) в вашем приведении.

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

1. Я использую Prop1 в пользовательском интерфейсе и не могу отобразить null; должен быть инициализирован. Что вы думаете об обработчике событий?

2. В этом случае используйте «Prop1= DatabaseField. Getvalueordefault()» ИЛИ «Prop1=(DatabaseField ?? «»)»

3. Нет, я использую MyObject для заполнения запроса linq, я хочу сохранить связанный с запросом код отдельно от определений классов.