2012-05-16 30 views
2

我可以讓我的EF對象只檢索執行的sql中的特定列嗎?如何檢索實體框架中的特定列

如果我有一列包含大量數據,真的會減慢查詢速度,我該如何讓我的對象從生成的sql中排除該列?

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

select Id, Name from TableName 

,而不是

select Id, Name, Data from TableName 

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

public List<T> GetBy<T>(DbContext context,Expression<Func<T, bool>> exp, Expression<Func<T,T>> columns) where T : class 
    { 

     return dbContext.Set<T>().Where(exp).Select<T,T>(columns).ToList(); 
    } 

我打電話像這樣

List<CampaignWorkType> list = GetBy<CampaignWorkType>(dbContext, c => c.Active == true, n => new { n.Id, n.Name }); 

我收到了像下面這樣的錯誤。

無法隱式轉換類型 'AnonymousType#1' 到 'Domain.Campaign.CampaignWorkType'

我怎麼能解決這個問題?

+0

我不認爲你可以返回一個匿名類型。 – jrummell

+0

如果你的表有太多的列,導致你的查詢運行速度明顯變慢,那麼你應該重構你的數據庫表。你不能只是從設計師那裏刪除這些專欄? –

+1

如果你不明白,請不要回答。 – tobias

回答

9

的解決方案是:

首先,定義了代理類型:

public class CampaignWorkTypesSimpleList 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

然後改變通用方法是這樣的:

public List<U> GetBy<T,U>(DbContext context,Expression<Func<T, bool>> exp, Expression<Func<T,U>> columns) 
       where T : class 
       where U : class 
{ 

    return dbContext.Set<T>().Where(exp).Select<T, U>(columns).ToList(); 
} 

最後,執行它。

List<CampaignWorkTypesSimpleList> list = this.GetBy<CampaignWorkType, CampaignWorkTypesSimpleList>(dbContext, c => c.Active == true, n => new CampaignWorkTypesSimpleList { Id = n.Id, Name = n.Name }); 
+0

你怎麼知道哪個表查詢? nevermind - 它是由T設置的dbset(寫在這裏供其他可能需要它的人使用) – toy

-2

假設您正在使用EF設計器,請使用實體模型設計圖面從實體模型中移除[數據]列。

相關問題