1 回答

TA貢獻1872條經驗 獲得超4個贊
如果您想在同一Where
表達式中同時過濾日志文件名和日志文件內容,我看不到沒有自定義IQueryable
LINQ 提供程序的解決方案,因為這正是它們的用例:以智能方式訪問數據方式基于LINQ 查詢中使用的表達式。
也就是說,使用多步驟方法作為折衷方案可能是值得的:
使用LINQ限制要搜索的日志文件,
讀取文件和
使用 LINQ 進行進一步搜索。
例子:
IEnumerable<LogFile> files = LogFiles.Where(f => f.Date > new DateTime(17, 1, 1) && f.AccountID == 4711);
IEnumerable<LogData> data = ParseLogFiles(files);
IEnumerable<LogData> filteredData = data.Where(d => d.val1 == 42 && d.val2 > 17);
LogData firstMatch = filteredData.FirstOrDefault();
如果您實現ParseLogFiles(a) 延遲執行和 (b) 作為 上的擴展方法IEnumerable<LogFile>,則生成的代碼將在外觀上與純 LINQ 非常相似:
var filteredData = LogFiles.
Where(f => f.Date > new DateTime(17, 1, 1) && f.AccountID = 4711).
ParseLogFiles().
Where(d => d.val == 42 && d.val2 > 17);
// If ParseLogFiles uses deferred execution, the following line won't read
// more log files than required to get the first matching row:
var firstMatch = filteredData.First();
這比在一個 LINQ 查詢中包含所有內容要多一些工作,但它使您不必實現自己的 LINQ 提供程序。
- 1 回答
- 0 關注
- 190 瀏覽
添加回答
舉報