У меня есть следующая ситуация в универсальном классе:
IQueryable<TQuote> query = GetQuotes(ctx)
, где ctx
- это контекст базы данных, а GetQuotes
возвращает DbSet<TQuote>
.
Затем где-то вниз по кодузапрос выполнен.Его упрощенная форма выглядит следующим образом:
var list = await query
.Select(v => new
{
v.Id,
TimeZone = v.Property != null ? (int?)v.Property.TimeZone : null
// and about 10 more simple properties like v.Id above
}
.ToListAsync();
, где Property
- это свойство навигации (к другой таблице), а TimeZone
- это просто обычный столбец / свойство базы данных типа int?
в C #.
Все работало, пока я не попытался использовать этот универсальный класс с сущностью, у которой нет свойства навигации Property
.Итак, я хотел бы заменить «жестко закодированное» выражение v.Property != null ? (int?)v.Property.TimeZone : null
на абстрактный член класса, а затем переопределить его по-разному для различных типов TQuote
.
Я пробовал что-то по этой сигнатуре:
protected abstract Expression<Func<TQuote, int?>> GetTimeZone();
, но потом, если я использую это в LINQ (сначала напрямую или присваивая какой-либо переменной), то сигнатура TimeZone
также изменится наExpression<...>
и если я пытаюсь ...Compile().Invoke(v)
, то LINQ жалуется, что LINQ для сущностей не поддерживает это.
Я видел этот ответ: Создайте динамическое выражение Linq to EF, чтобы выбрать IQueryable в новыйСвойства класса и присваивания Тем не менее, он создает весь селектор руками, и, учитывая, что у меня есть 16 свойств, создание и поддержание которых было бы затруднительно.Поэтому мне интересно, могу ли я что-то сделать только с этим TimeZone
, но оставлю все остальное в простой форме LINQ, как указано выше.
Возможно ли это, и если да, то как именно?