IQueryable不返回Count属性

时间:2015-04-14 14:52:54

标签: c# linq entity-framework

    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。

1 个答案:

答案 0 :(得分:3)

您可能忘记包含正确的命名空间。

您在IntelliSense中看到的方法名为QueryableExtensions.CountAsync<TSource>,在System.Data.Entity命名空间中定义,返回Task<int>,因此应该等待。

您正在寻找的方法(不是属性)名为Queryable.Count<T>(),并在System.Linq命名空间中定义。它返回int,不应该等待。

如果操作涉及IO,它可能会执行,您想使用CountAsync