只獲取特定列

entity-framework

我可以讓我的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),Status(int),Data(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});

但是,我收到編譯錯誤:

無法將類型'AnonymousType#1'隱式轉換為'Entities.BatchRequest'

一般承認的答案

當然。投影是這樣的:

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

這是一個實際的例子(很明顯,我的DB有不同的表格)。我將我的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);
}

現在,表達式可以返回您需要使用的任何類型。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因