我想通过给定主键数组来检索多个记录,并且必须对所有实体都采用通用方法。
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));
我希望我的实体列与现在的相同。如何使用这种数据库结构实现通用搜索方法以查找多个记录?
答案 0 :(得分:2)
在应用程序模型和数据库模型中可以使用不同的名称。您将必须将模型ID映射到数据库中的名称:
在“映射”中,每个实体都具有与此类似的内容: this.Property(t => t.Id).HasColumnName(“ ProductId”);
答案 1 :(得分:2)
您可以使用EF Core提供的元数据服务(例如FindEntityType和FindPrimaryKey)来获取PK属性名称。然后,您可以使用它使用另一个EF Core提供的有用方法EF.Property来访问LINQ to Entities查询中的PK值。
类似这样的东西:
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();
}