【发布时间】:2019-04-02 21:32:27
【问题描述】:
我有一个数据库模型,我想(在运行时)过滤不同的属性。为此,我有每个方法根据属性运行一个“where”子句并返回一个 IQueryable。问题是该子句无法转换为 SQL,因此查询运行时没有“WHERE”语句,返回整个表并且服务器正在执行过滤,这既慢又昂贵。
从日志中,我收到一条消息:
Microsoft.EntityFrameworkCore.Query:警告:LINQ 表达式 'where (new EntityId([ed].EntityId).Id == __entityId_Id_1)' 不能 翻译并在本地进行评估。
我的问题是:我是否在正确的轨道上?如果是的话,我接下来应该看哪里?
主要功能
public static EntityDataDTO GetEntityByKey(this IQueryable<EntityDTO> query, IEntityId entityId, EntityTypeDTO type, string key)
{
return query
.HasEntity(entityId)
.HasType(type)
.HasKey(key)
.FirstOrDefault();
}
public static EntityDataDTO GetEntity(this IQueryable<EntityDTO> query, IEntityId entityId, EntityTypeDTO type)
{
return query
.HasEntity(entityId)
.HasType(type)
.FirstOrDefault();
}
子功能
public static IQueryable<EntityDDTO> HasType(this IQueryable<EntityDTO> query, EntityTypeDTO type)
{
return query.Where(ed => ed.Type == type);
}
public static IQueryable<EntityDTO> HasEntity(this IQueryable<EntityDTO> query, IEntityId entityId)
{
return query.Where(ed => ed.EntityId.Id == entityId.Id);
}
实体DTO
public class EntityDTO
{
public int Id { get; set; }
public EntityTypeDTO Type { get; set; }
public string Key { get; set; }
public string Value { get; set; }
public IEntityId EntityId { get; set; }
public IPartnerId PartnerId { get; set; }
}
【问题讨论】:
-
考虑将条件转换为表达式并使用 Where 子句。查看this link
-
显示你的
EntityDTO班级 -
为什么要使用 Dtos 作为实体?! DTO = 域传输对象,其中一个实体(与 EF Core/ORM 一起)表示数据库结构。不清楚你想达到什么目标
-
问题很可能是接口
IEntityId- EF(核心)不能很好地处理接口(除了与集合相关的),也不是“值对象”。
标签: c# .net-core entity-framework-core