c#如何将代码转换为通用版本?

时间:2012-08-07 07:26:29

标签: c#-4.0 entity-framework-4

我试图以更通用的方式编写此代码:是否有可能基于T i可以使用正确的实体框架实体?例如,如果我使用:

public IQueryable<T> GetCount(string filterExpression)
{
   //return db.Persons.Where("it." + filterExpression);
   return db. ? .Where("it." + filterExpression); // depending on type T
}

更新

所以我现在这样做了:

  public int GetCount<T>(string filter)
        where T : class
        {
            NortwindEntities db = new NortwindEntities();
            return db.CreateObjectSet<T>().Where(filter).Count();
        }

错误:

Error   2   The constraints for type parameter 'T' of method 'MyBase<T>.GetCount<T>(string)' must match the constraints for type parameter 'T' of interface method 'MyBase<T>.GetCount<T>(string)'. Consider using an explicit interface implementation instead

1 个答案:

答案 0 :(得分:1)

您确定要查询T吗? (您的方法名称为GetCount。)

您可以执行此操作以从IQueryable<T>获得DbContext

public IQueryable<T> GetCount<T>(Func<T, bool> predicate)
    where T : class
{
    MyContext db = new MyContext();
    return db.Set<T>().Where(predicate).AsQueryable();
}

IQueryable<Person> result = GetCount<Person>(x => x.Id == 1);

我建议使用名称Where作为您的方法名称。

public IQueryable<T> Where<T>(Func<T, bool> predicate)
    where T : class
{
    MyContext db = new MyContext();
    return db.Set<T>().Where(predicate).AsQueryable();
}

IQueryable<Person> result = Where<Person>(x => x.Id == 1);

更新

如果您收到以下异常,请使用where T : class装饰该方法。

  

类型'T'必须是引用类型才能在泛型类型或方法中将其用作参数'TEntity'?

更新2

似乎你真的只想要数。

public int GetCount<T>(Func<T, bool> predicate)
    where T : class
{
    MyContext db = new MyContext();
    return db.Set<T>().Where(predicate).Count();
}

int count = GetCount<Person>(x => x.Id == 1);