【问题标题】:Include in Entity Framework and Cosmos DB包含在实体框架和 Cosmos DB 中
【发布时间】:2019-11-19 16:13:30
【问题描述】:

我对 Entity Framework 和 Cosmos DB 有疑问。

当我在这样的实体上使用.Include 时:

 public async Task<People[]> GetAllPeopleAsync()
 { 
     IQueryable<People> query = _context.Peoples.Include(p => p.Info);
     return await query.ToArrayAsync();            
 }

我收到此错误:

Banco De dados Falhos LINQ 表达式 'LeftJoin, TransparentIdentifier>(outer: DbSet, inner: DbSet, outerKeySelector: (p) => 属性>(p, "Id"), innerKeySelector: (i) => 属性>(i, "PeopleId"), resultSelector: (o, i) => new TransparentIdentifier( 外 = o, 内 = 我 ))' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。

保存数据作为 SQL 正常工作:

public void Add<T>(T entity) where T : class
{
     _context.Add(entity);
}

public async Task<bool> SaveChangesAsync()
{
     return (await _context.SaveChangesAsync()) > 0;
}

我的实体:

public class People
{
     public Guid Id { get; set; }
     public string Name { get; set; }
     public Info Info { get; set; }    
}

public class Info
{
     public Guid Id { get; set; }
     public string Street { get; set; }
     public string Number { get; set; }
     public Guid PeopleId { get; set; }
     public People People { get; }
}

为了解决这个问题,我创建了一个从PeopleId 获取信息的函数,然后将其放入People,它可以按我的需要工作:

public async Task<Info[]> GetInfoByPepleIdAsync(Guid guidPeople)
{ 
    IQueryable<Info> query = _context.Infos.Where(i => i.PeopleId == guidPeople);
    return await query.ToArrayAsync();
}

GetAllPeopleAsync 函数如下所示:

public async Task<People[]> GetAllPeopleAsync()
{ 
   IQueryable<People> query = _context.Peoples;
   var Peoples = await query.ToArrayAsync();

   foreach(People p in Peoples) 
   {
       var Infos = await GetInfoByPepleIdAsync(p.Id);
       p.Info = Infos.FirstOrDefault();
   }

   return Peoples;            
 }

我想知道是否有任何方法可以像包含在 CosmosDB 中一样工作?

如果没有等效的方法,这个方法是可行的还是我会有一些性能问题或什么?

【问题讨论】:

    标签: entity-framework .net-core azure-cosmosdb


    【解决方案1】:

    自 2019 年 12 月 3 日起,EF Core Cosmos DB Provider 不支持 Include 和 Join。

    https://docs.microsoft.com/en-us/ef/core/providers/cosmos/limitations

    您可以在 Github 上跟踪未解决的问题,以查看是否/何时为 EF Core 3.1 实施。您甚至可以通过预览版抢先体验。 Include 未随 3.1 发布。您仍然可以在此处跟踪该功能的进度:

    https://github.com/aspnet/EntityFrameworkCore/issues?page=1&q=is%3Aissue+is%3Aopen+Cosmos+in%3Atitle+label%3Atype-enhancement+sort%3Areactions-%2B1-desc

    今年早些时候,朱莉·勒曼 (Julie Lerman) 发布了一篇博客,大致展示了 Include 预计如何与 Cosmos 合作。如果实现类似于该预览,则当 EF 推断上下文中的实体之间存在图形/节点样式关系时,EF 将添加类似于外键的内容。

    https://docs.microsoft.com/en-us/archive/msdn-magazine/2019/january/data-points-a-peek-at-the-ef-core-cosmos-db-provider-preview

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      相关资源
      最近更新 更多