2009-10-07 25 views
37

我可以讓我的EF對象只檢索執行的sql中的特定列嗎?如果我正在執行下面的代碼來檢索對象,有什麼我可以做的只是如果想要獲得某些列?只能得到特定列

public IEnumerable<T> GetBy(Expression<Func<T, bool>> exp) 
{ 
    return _ctx.CreateQuery<T>(typeof(T).Name).Where<T>(exp); 
} 

這將生成一個包含所有列的select子句。但是,如果我有一個列包含大量的數據,真的會減慢查詢,我怎樣才能讓我的對象從sql中排除該列?

如果我的表已經ID(INT),狀態(INT),數據(BLOB),我怎樣才能讓我的查詢是

select Id, Status from TableName 

,而不是

select Id, Status, Data from TableName 

從下面的建議,我的方法是

public IEnumerable<T> GetBy(Expression<Func<T, bool>> exp, Expression<Func<T, T>> columns) 
{ 
    return Table.Where<T>(exp).Select<T, T>(columns); 
} 

我打電話像這樣

mgr.GetBy(f => f.Id < 10000, n => new {n.Id, n.Status}); 

但是,我得到一個編譯錯誤:

Cannot implicitly convert type 'AnonymousType#1' to 'Entities.BatchRequest'

回答

51

肯定。投影是這樣的:

var q = from r in Context.TableName 
     select new 
     { 
      Id = r.Id, 
      Status = r.Status 
     } 

下面是一個實際的例子(顯然,我的數據庫有不同於你的表)。我將我的EF模型LINQPad和鍵入以下查詢:

from at in AddressTypes 
select new 
{ 
    Id = at.Id, 
    Code = at.Code 
} 

LINQPad讓我發現,生成的SQL是:

SELECT 
    1 AS [C1], 
    [Extent1].[AddressTypeId] AS [AddressTypeId], 
    [Extent1].[Code] AS [Code] 
FROM 
    [dbo].[AddressType] AS [Extent1] 

從表中的其他字段均包括在內。

應對更新問題

columns爭論說,它需要一個類型T,並返回相同的類型。因此,通過表達必須符合這一點,或者您需要更改參數的類型,即:

public IEnumerable<U> GetBy<U>(Expression<Func<T, bool>> exp, Expression<Func<T, U>> columns) 
{ 
    return Table.Where<T>(exp).Select<T, U>(columns); 
} 

現在表達可以回到你願意使用任何類型的。

+0

我想以通用的方式做到這一點,以便我可以簡單地嚮應該返回的列的GetBy方法調用添加另一個參數。 – Brian 2009-10-07 14:41:01

+0

您需要將選擇表達式與where表達式一起傳遞,然後,即:var foo = GetBy(r => r.Id == someId,r => new {r.Id,R.Status}); – 2009-10-07 14:46:43

+0

編輯我的帖子上面有更多的信息 – Brian 2009-10-07 15:07:03