[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的優點和缺點是什麼?

很感謝任何形式的幫助。




Links