我对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>(外部:DbSet,内部:DbSet, externalKeySelector:(p)=>属性>(p,“ Id”), innerKeySelector:(i)=>属性>(i,“ PeopleId”), resultSelector:(o,i)=>新的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中的include那样使用?
如果没有等效的方法,则该方法可行,否则我会遇到性能问题或其他问题?
答案 0 :(得分:0)
从2019年12月3日开始,EF Core Cosmos数据库提供程序不支持包含和加入。
https://docs.microsoft.com/en-us/ef/core/providers/cosmos/limitations
您可以在Github上跟踪未解决的问题,以查看是否/何时为EF Core 3.1实施了该问题。您甚至可以通过预览版获得早期访问权。 Include不是3.1发行的。您仍然可以在此处跟踪该功能的进度:
今年早些时候,朱莉·勒曼(Julie Lerman)发布了一个博客,大致显示了Include如何与Cosmos合作。如果实现类似于预览,则当EF推断上下文中实体之间存在图/节点样式关系时,EF将添加类似于外键的内容。