Код: Выделить всё
$expand-MyChildEntites
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;
}
Вот iqueryable без проекции, которая получает $ expand работать:
Код: Выделить всё
IQueryable queryable = dbContextToUse.MyParentEntity.FromSqlRaw(sql)
.AsNoTracking()
.OrderBy(linqOrderByClause);
< /code>
Я хотел бы сделать: вернуть проекцию, чтобы я мог иметь рассчитанные данные полевых данных. В настоящее время я пробегаю через полученный список и заполняю поля Photourl
Я хотел бы избежать использования Этот цикл, если я могу, и рассчитать значения URL в проекции. Это кажется более эффективным и чище, чтобы сделать это. Заранее, чтобы рассмотреть мою проблему. 6.0.14 (SQL Server) < /li>
[*] Я использую Odata 7.5.17 < /li>
Я попробовал ленивую загрузку и стремление нагрузки (мой обходной путь использует ленивую загрузку)
[*] Я попытался использовать атрибут notmapped для расчетного поля
Я попытался использовать .include ()
< /ol>
Я надеюсь, что мое решение будет сделано с проекцией, чтобы избежать цикла, который я делаю после логики. < /p>
Подробнее здесь: https://stackoverflow.com/questions/793 ... 6-iqueryab