2015-09-04 58 views
1

我有這個C#L2S代碼:LINQ查詢檢索整個記錄,而不是一個領域

Table<ERPRaw> linqRawFile = db.GetTable<RawFile>(); 
var linqNameList = 
    from row in linqRawFile.AsEnumerable() 
    select row.fileName; 
currentFileNameList = linqNameList.ToArray(); 

它應該只讀文件名場,但是當我在SQL Server Profiler中檢查,我看到這個查詢觸發完整的記錄加載。這些字段包含文件二進制數據,因此全表加載需要相當長的時間。僅檢索fileName字段只需要幾毫秒。

什麼是正確的方式來檢索作爲字符串數組中的RawFile的只fileName字段?我假設linq框架現在全部加載每個RawFile記錄,因爲它沒有看到我將只從列表中檢索到fileName屬性。

也許我必須構建查詢而不參考linqRawFile呢?那麼這是否會忽視linq在項目中引入的原因,以便將數據庫層抽象出來?

+0

可能是由於'.AsEnumerable()'' – Ric

+0

VAR linqNameList =(從行linqRawFile選擇行。文件名).ToList();' – markpsmith

回答

1

它應該只讀文件名域

不,不。以下是發生了什麼:您的查詢執行發生在兩個地方 - RDBMS和內存中。 db.GetTable<RawFile>()發生在RDBMS中;它在內存中發生後的所有內容,因爲你使用AsEnumerable()

發生投影的部分查詢(即從整行中提取row.fileName列)發生在內存中。查詢的RDBMS部分不知道這個預測。 db.GetTable<RawFile>()是所有SQL生成的LINQ提供者看到的,所以它自然返回整行。

如果你寫對您的SQL源的組合查詢,投影將在SQL發生:

var linqNameList = 
    from row in db.GetTable<RawFile>() 
    select row.fileName; 
1

你應該能夠與它來取代整個事情:

var currentFileNameList = db.GetTable<RawFile>().Select(r => r.fileName).ToArray(); 
相關問題