Игнорировать свойства класса, доступные только для чтения, при использовании DataContext.ExecuteQuery<T>
-
22-08-2019 - |
Вопрос
Как указать контексту данных LINQ игнорировать определенные свойства или все свойства, доступные только для чтения, при привязке набора результатов к объекту?
Я работаю с некоторыми операторами T-SQL, которые сложно выразить с помощью LINQ, поэтому я использую метод ExecuteQuery контекста данных для передачи прямого T-SQL в базу данных.
Если мой класс T имеет какие-либо свойства только для чтения, я получаю исключения во время выполнения, когда контекст данных пытается установить эти свойства и терпит неудачу, поскольку нет свойства установки.Как мне сообщить контексту, чтобы он игнорировал эти свойства?
Это то, что я делаю сейчас.Это работает, но это отстой:
public bool IsPaidInFull {
get { return NetTotal <= 0m; }
set { /* needed so linq doesn't choke. Should never be set by hand */ }
}
Решение
Вы рассматривали Linq to Entities?Возможно, преобразование вашего проекта не стоит усилий, в зависимости от того, насколько далеко вы продвинулись или сколько накладных расходов вас устраивает.Однако именно этот сценарий не будет проблемой в Linq to Entities.Он не пытается обновить свойства объекта, доступные только для чтения, при его загрузке, поскольку они не сопоставлены явно, а являются просто свойствами расширения.
Кроме того, вы можете пойти по пути старой школы/Java, используя функции получения вместо свойств.public bool getIsPaidInFull() {return NetTotal <= 0m;}.
Или вы могли бы поиграться с реализацией свойств только для чтения в унаследованном дочернем классе, но это может привести к разного рода проблемам с типами.
Другие советы
public bool IsPaidInFull
{
get { return NetTotal <= 0m; }
private set { ;}
}