2013-04-30 60 views
0
public interface IDepartmentDataSource 
{ 
    IQueryable<Department> Departments { get; } 
} 

public class DepartmentDb : DbContext, IDepartmentDataSource 
{ 
    //Error: property cannot implement property.... 
    public DbSet<Department> Departments { get; set; } 


    //should be: 
    //public IQueryable<Department> Departments { get; set; } 
} 

(从Pluralsight使用的代码)DbSet <TEntity>,IQueryable的<TEntity> - OOP概念

从MSDN:

public class DbSet<TEntity> : DbQuery<TEntity>, 
IDbSet<TEntity>, IQueryable<TEntity>, IEnumerable<TEntity>, 
IQueryable, IEnumerable 
where TEntity : class 

我为什么要专门为实现IQueryable的?

回答

0
public class DepartmentDb : DbContext, IDepartmentDataSource 
{ 
    //Error: property cannot implement property.... 
    public DbSet<Department> Departments { get; set; } 
} 

public class MyQueryable<T> : IQueryable<T> {} 

.... 

MyDepartmentDb.Departments = new MyQueryable<Department>(); // Error! 
// but it implements IDepartmentDataSource 
// which should let any IQueryable<Department> in, so what gives?? 

因为上面的代码不会工作,但应该。即您应该可以将任何IQueryable<Department>分配给Departments资产,而不仅仅是DbSet<Department>

1
public class DepartmentDb : DbContext, IDepartmentDataSource 
{ 
    public DbSet<Department> Departments { get; set; } 

    IQueryable<Department> IDepartmentDataSource.Departments 
    { 
     get { return Departments; } 
    } 
} 

你应该明确你的DbSet从接口类IDepartmentDataSource设置。

+0

没有解释为什么你必须明确地做到这一点,但它是正确的做法。 – kjbartel 2014-12-24 09:39:06