#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, я хочу сохранить связанный с запросом код отдельно от определений классов.