ASP.NET CORE 6 WEB API API ODATA $ Команда Expand не работает с EF CORE 6 IQUERYABLE с проекциейC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 ASP.NET CORE 6 WEB API API ODATA $ Команда Expand не работает с EF CORE 6 IQUERYABLE с проекцией

Сообщение Anonymous »

У меня есть конечная точка API с поддержкой ODATA, которая извлекает данные из сущности, которая имеет отношения с одним ко многим. Если клиент хочет, чтобы дочерние объекты были включены в ответ API, он отправит конечную точку следующую команду ODATA: < /p>

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

$expand-MyChildEntites
Если они не хотят, чтобы дочерние объекты не отправили бы API $ expand команда Odata.
API получает Эти данные с использованием контекста Iqueryable с использованием контекста EF Core 6. В этом Iqueryable я использую проекцию, потому что одним из полей в ответе является рассчитанное поле. Для них с $ expand или нет.
Если я удалю проекцию (потеря данных моего расчетного поля), odata $ expand работает, как и ожидалось. И если клиент не использует его, данные субъекта детей не возвращаются (работая, как и ожидалось).
Вот примеры псевдокода моих классов сущностей и логики.
My EF Core Model Class: < /p>

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

public class MyParentEntity
{
[Key]
public int Id { get; set; }
public string Email { get; set; }

//navigation property
public virtual ICollection MyChildEntities { get; set; } = new
List();
}

public class MyChildEntity
{
[Key]
public int Id { get; set; }
public string SomeData { get; set; }
....
}

public class MyEntityView : MyParentEntity
{
//calculated field
public string PhotoURL { get; set; }
}

// My EF Core context class:
public partial class MyDBContext : DBContext
{
public MyDBContext (DbContextOptions options)
: base(options)
{
}

public virtual DbSet MyParentEntity { get; set; }
public virtual DbSet MyChildEntity { get; set; }

modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.Id)
.HasName("PK__MyParentEntity__7980AC1A71B86337");

entity.HasMany(a => a.MyChildEntites)
.WithOne()
.HasForeignKey(c => c.Id);

//more code...
}
}

// IQueryable logic:
private IQueryable GetView()
{
string sql = GetTheDefaultQuery(out string linqOrderByClause);

Dictionary allImageURLs =
PhotoHelper.GetAllImageURLs(out string defaultImageURL);

IQueryable queryable =
_myDBContext.MyParentEntity.FromSqlRaw(sql)
.AsNoTracking()
.OrderBy(linqOrderByClause)
.Select(v => new MyEntityView()
{
Id = v.ID,
Email = v.Email,

MyChildEntities = v.MyChildEntities,

//determine Photo URL (calculated field logic)
PhotoURL =
!string.IsNullOrWhiteSpace(v.Email) &&
allImageURLs.ContainsKey(v.Email) ?
allImageURLs[v.Email] : defaultImageURL,
});

return queryable;
}
Теперь, если я удалю проекцию, потеря моей расчетной логики поля, $ expand (и ее отсутствие) работает так, как и ожидалось, включая или не включая данные дочернего организации.
Вот iqueryable без проекции, которая получает $ expand работать:

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

IQueryable queryable = dbContextToUse.MyParentEntity.FromSqlRaw(sql)
.AsNoTracking()
.OrderBy(linqOrderByClause);
< /code>
Я хотел бы сделать: вернуть проекцию, чтобы я мог иметь рассчитанные данные полевых данных. В настоящее время я пробегаю через полученный список и заполняю поля Photourl 
после .tolist () используется в запросе.
Я хотел бы избежать использования Этот цикл, если я могу, и рассчитать значения URL в проекции. Это кажется более эффективным и чище, чтобы сделать это. Заранее, чтобы рассмотреть мою проблему. 6.0.14 (SQL Server) < /li>
[*] Я использую Odata 7.5.17 < /li>
Я попробовал ленивую загрузку и стремление нагрузки (мой обходной путь использует ленивую загрузку)
[*] Я попытался использовать атрибут notmapped для расчетного поля
Я попытался использовать .include ()
< /ol>
Я надеюсь, что мое решение будет сделано с проекцией, чтобы избежать цикла, который я делаю после логики. < /p>

Подробнее здесь: https://stackoverflow.com/questions/793 ... 6-iqueryab
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • .NET Core OData – $expand не работает с ODataQueryOptions в серверной части
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • C# .NET Core 6.0 — IQueryable, OData и сопоставленная функция, вызванная из оператора LINQ, не может быть переведена [ду
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Использование OData Expand с DTO
    Anonymous » » в форуме C#
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Iqueryable.where.tolist vs iqueryable.tolist.where, какой запрос лучше с точки зрения производительности?
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Iqueryable.where.tolist vs iqueryable.tolist.where, какой запрос лучше с точки зрения производительности?
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous

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