动态地在DbContext中获取Dbset的行数

时间:2017-07-06 13:59:38

标签: c# entity-framework dbcontext dbset

我有一个表单,可以将DbContext的实例和表的实体传递给它,如下所示:

public frm_foo(DbContext DatabaseContext, DbSet TableEntity)
        {
           InitializeComponent();
           var res =GetRowCount(DatabaseContext,TableEntity);
        }

并致电表格承包商:

new frm_foo(dbContext, dbContext.Set<IpRoom>()).ShowDialog();

Context包含一个IpRoom表。

我希望在一个函数中获取行数,该函数将DbContextDbset实例发送给它,如下所示:

public int GetRowCount(DbContext DatabaseContext, DbSet TableEntity)
   {
       var countVal = (from a in DatabaseContext.Set(TableEntity.GetType())
                        select a).Count();
       return countVal;
   }

但得到了错误:

  

无法找到源类型的查询模式的实现   'DbSet'。 “选择”未找到。

DatabaseContext.Set(TableEntity.GetType())返回Dbset!谁知道我错了什么?提前致谢

Ps :我不想使用SqlQuery,例如:

var sql = "SELECT COUNT(*) FROM dbo.IpRoom";
var total = context.Database.SqlQuery<int>(sql).Single();

3 个答案:

答案 0 :(得分:1)

DbSet未实现IQueryable,DbSet<T>。例如

public static int GetRowCount<T>(DbContext DatabaseContext, DbSet<T> TableEntity)
{
    var countVal = TableEntity.Count();
    return countVal;
}

答案 1 :(得分:0)

为了获得通用行数,我使用以下方法。

proxyPort=8080

答案 2 :(得分:-1)

我找到了!只需在项目中添加一个类:

namespace System.Data.Entity
{
  public static class EntityFrameworkExtensions
  {
    public static IEnumerable<object> AsEnumerable(this DbSet set)
    {
      foreach (var entity in set)
        yield return entity;
    }
  }
}

此类向AsEnumerable实例添加通用方法DbSet,当您想要将其用于 Count 时:

 var count = (from a in TableEntity.AsEnumerable() select a).Count();