public interface IRepository<T> : IDisposable
{
void Add(T newEntity);
void Delete(T entity);
T Find(int id);
IQueryable<T> FindAll();
int Commit();
}
public class SqlRepository<T> : IRepository<T> where T : class
{
DbContext context;
DbSet<T> set;
public SqlRepository(DbContext context)
{
this.context = context;
this.set = context.Set<T>();
}
public void Add(T newEntity)
{
this.set.Add(newEntity);
}
public void Delete(T entity)
{
}
public T Find(int id)
{
throw new Exception("todo");
}
public IQueryable<T> FindAll()
{
return this.set;
}
public int Commit()
{
return this.context.SaveChanges();
}
public void Dispose()
{
this.context.Dispose();
}
}
using (IRepository<Contact> e = new SqlRepository<Contact>(new AppointmentReminderDb()))
{
e.Add(new Contact() { Active = true });
e.Add(new Contact() { Active = true });
e.Commit();
var count = await e.FindAll().Count(); // do not get Count property
}
在上面的代码行中,我不明白为什么我没有获得Count属性。相反,我得到了CountAsynch。我真的很想得到Count属性。 我在界面和类方法中正确定义了FindAll的IQueryable。
答案 0 :(得分:3)
您可能忘记包含正确的命名空间。
您在IntelliSense中看到的方法名为QueryableExtensions.CountAsync<TSource>
,在System.Data.Entity
命名空间中定义,返回Task<int>
,因此应该等待。
您正在寻找的方法(不是属性)名为Queryable.Count<T>()
,并在System.Linq
命名空间中定义。它返回int
,不应该等待。
如果操作涉及IO,它可能会执行,您想使用CountAsync
。