Как я могу проецировать сущность таким образом, чтобы он оставался отфильтруемым в базе данных?C#

Место общения программистов C#
Ответить
Anonymous
 Как я могу проецировать сущность таким образом, чтобы он оставался отфильтруемым в базе данных?

Сообщение Anonymous »

Я пытаюсь проецировать результат следующего запроса в EF Core 8 объектов: < /p>

Код: Выделить всё

select foo.*
, (case when hst.Id is not null and foo.OtherColumn = 1 then 42 else null end) as Bar
from FooEntities foo
left join
FooEntities for system_time all hst on hst.Id          = foo.Id
and hst.OtherColumn = 999
< /code>
FooEntities
-это временная таблица, которую я самостоятельна, чтобы рассчитать дополнительное значение для возврата. Я знаю, что самым простым способом достижения этого было бы приведенный выше запрос в качестве представления, но я намеренно избегаю этого, поскольку такая бизнес-логика должна быть определена в C#, а не в SQL. < /P>
Я использую первый подход (объекты, генерируемые из DB), поэтому начинайте с: < /p>

Код: Выделить всё

// generated from DB
public partial class FooEntity
{
public int Id { get; set; }

public byte OtherColumn { get; set; }

... other properties...
}

public partial class MyDbContext : DbContext
{
public virtual DbSet FooEntities { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity(... mapping configuration...);
}
}
< /code>
Now I add Bar
из результатов, как свойство, которое EF не будет пытаться заполнить или сохранять в базе данных:

Код: Выделить всё

// manually created
public partial class FooEntity
{
public int? Bar { get; set; }
}

public partial class MyDbContext
{
partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
{
modelBuilder.Entity(entity => entity.Ignore(e => e.Bar));
}
}
< /code>
I then have the following LINQ-to-entities method to encapsulate the above query:
public IQueryable QueryFoosWithBar(IQueryable foos)
{
return foos
.GroupJoin(
_dbContext.Set().TemporalAll().Where(hst => hst.OtherColumn == 999),
foo => foo.Id,
hst => hst.Id,
(foo, hst) => foo.MapBar(hst.DefaultIfEmpty().First() != default
&& foo.OtherColumn == 1 ? 42 : null));
}
< /code>
where MapBar
- метод расширения, определяемый как

Код: Выделить всё

public static FooEntity MapBar(
this FooEntity foo,
int? bar)
{
foo.Bar = bar;

return foo;
}
< /code>
If I materialise the result of QueryFoosWithBar
Я возвращаю объекты с помощью свойства , правильно заполненной в каждом случае. However, I need to post-filter the result of QueryFoosWithBar on the database, before it's materialised and it's here where EF blows up with the dreaded exception:

The LINQ expression ... could not be translated

In other words, this works:

Код: Выделить всё

var results = await QueryFoosWithBar(... expression...).ToArrayAsync();
< /code>
but this doesn't:
var results = await QueryFoosWithBar(... expression...).OrderBy(foo => foo.Id).ToArrayAsync();
< /code>
I presume it's because EF Core doesn't understand that the projected FooEntity
-с- экземпляры по -прежнему являются Foostity - Как я могу преодолеть это? Или я иду о том, что я пытаюсь попытаться совершенно неправильно?

Подробнее здесь: https://stackoverflow.com/questions/797 ... n-the-data
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»