我想通过提供主键数组来检索多条记录,我必须为所有实体创建它的通用方法。private DbSet<TEntity> _entities; /// <summary> /// Get entity by identifier /// </summary> /// <param name="id">Identifier</param> /// <returns>Entity</returns> public virtual TEntity GetById(object id) { return Entities.Find(id); } /// <summary> /// Get entity by identifier /// </summary> /// <param name="id">Identifier</param> /// <returns>Entity</returns> public virtual List<TEntity> GetByIds(int id[]) { // want to make it generic return Entities.Where(x=>id.Contains(id)); } /// <summary> /// Gets an entity set /// </summary> protected virtual DbSet<TEntity> Entities { get { if (_entities == null) _entities = _context.Set<TEntity>(); return _entities; } }这里的问题是我的实体没有 ID 列,例如产品有 ProductId,订单有 OrderId。我不想将我的数据库列更改为 Id。Entities.Where(x=>id.Contains(id));我希望我的实体列与现在相同。我可以使用此数据库结构实现通用搜索方法来查找多条记录吗?
2 回答
牧羊人nacy
TA贡献1862条经验 获得超7个赞
您可以使用 EF Core 提供的元数据服务(如FindEntityType和FindPrimaryKey)来获取 PK 属性名称。然后,您可以使用它访问 LINQ to Entities 查询中的 PK 值,使用另一个 EF Core 提供的有用方法EF.Property。
是这样的:
public virtual List<TEntity> GetByIds(int[] ids)
{
var idName = _context.Model.FindEntityType(typeof(TEntity))
.FindPrimaryKey().Properties.Single().Name;
return Entities
.Where(x => ids.Contains(EF.Property<int>(x, idName)))
.ToList();
}
一只萌萌小番薯
TA贡献1795条经验 获得超7个赞
您可以在应用程序模型和数据库模型中使用不同的名称。您必须将模型 ID 映射到数据库中的名称:
在您的映射中,每个实体都会有类似的内容:this.Property(t => t.Id).HasColumnName("ProductId");
- 2 回答
- 0 关注
- 110 浏览
添加回答
举报
0/150
提交
取消