[C#] 返回IQueryable <T>或不返回IQueryable <T>


Answers

正如前面的回答所提到的,暴露IQueryable使得調用者能夠使用IQueryable本身,這或者會變得危險。

封裝業務邏輯的首要職責是維護數據庫的完整性。

你可以繼續暴露IList,可能會改變你的參數如下,這是我們正在做...

public interface ILocationRepository
{
    IList<Location> FindAll(int start, int size);
    IList<Location> FindForState(State state, int start, int size);
    IList<Location> FindForPostCode(string postCode, int start, int size);
}

如果大小== -1,然後返回所有...

替代方法...

如果你還想返回IQueryable,那麼你可以在你的函數中返回List的IQueryable ..例如...

public class MyRepository
{
    IQueryable<Location> FindAll()
    {
        List<Location> myLocations = ....;
        return myLocations.AsQueryable<Location>;
        // here Query can only be applied on this
        // subset, not directly to the database
    }
}

第一種方法比內存有一個優點,因為你將返回更少的數據而不是全部。

Question

我有一個存儲庫類,包裝我的LINQ到SQL數據上下文。 存儲庫類是包含所有數據層邏輯(以及緩存等)的業務線類。

這是我的回購界面的v1。

public interface ILocationRepository
{
    IList<Location> FindAll();
    IList<Location> FindForState(State state);
    IList<Location> FindForPostCode(string postCode);
}

但是為了處理FindAll的分頁問題,我在討論是否公開IQueryable <ILocation>而不是IList來簡化分頁等情況的接口。

從數據倉庫中暴露IQueryable的優點和缺點是什麼?

很感謝任何形式的幫助。