2014-12-28 42 views
0

我正在使用類似模式的通用存儲庫來獲取數據。有100多個實體,因此爲每個實體創建單獨的存儲庫並不是真正的選擇。這裏是來自同一個班上有幾個功能:Telerik OpenAccess爲每個函數調用生成相同的查詢

public int Count(Func<TEntity, bool> x=null) 
    { 
     return x == null ? 
      mgr.CTX.GetAll<TEntity>().Count() : 
      mgr.CTX.GetAll<TEntity>().Where(x).Count(); 
    } 

    public TEntity One(Func<TEntity, bool> x) 
    { 
     return mgr.CTX.GetAll<TEntity>().Where(x).Take(1).FirstOrDefault(); 
    } 

    public IQueryable<TEntity> All(Func<TEntity, bool> x=null) 
    { 
     return x == null ? 
      mgr.CTX.GetAll<TEntity>() : 
      mgr.CTX.GetAll<TEntity>().Where(x).AsQueryable<TEntity>(); 
    } 

的問題是無論哪個函數調用,SQL事件探查器顯示來自[表]

相同

選擇[列]

我想在使用Take(1)或Count()或Where()時應該使用計數(),頂部其中條款選擇但這些功能對查詢生成完全沒有影響。顯然,每次操作似乎都是在從服務器獲取所有數據後在內存中執行的。

指導我如果我訪問它的方式有問題或者這是telerik的正常行爲?

回答

1

我相信你是LINQ擴展方法定義之間細微區別的犧牲品 - 內存中的使用Func<>而SQL綁定使用Expression<>作爲參數類型。
我的建議是將All(Func<TEntity, bool> x=null)更改爲All(Expression<Func<TEntity, bool>> x=null)

+0

你是那麼對!我真的不知道有什麼不同。現在telerik OA正在生成正確的語句。並且當然非常快:P謝謝,有什麼好的資源可以學習表達式? –