亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 LINQ 查詢外部數據源

使用 LINQ 查詢外部數據源

C#
慕容3067478 2021-10-24 14:06:47
我存儲的內容基本上相當于存儲在 CSV 文件中的日志數據。它的格式<datetime>,<val1>,<val2>,等。但是,日志文件按帳戶 ID 和月份存儲,因此如果您跨月份或帳戶 ID 查詢,您將檢索多個文件。我希望能夠使用 LINQ 查詢它,這樣如果我可以調用logFiles.Where(o => o.Date > 1-1-17 && o.Date < 4-1-17). 我想我需要一些東西來檢查該查詢中的日期范圍,并注意到它跨越 4 個月,然后導致它只檢查該日期范圍內的文件。有什么方法可以做到這一點,而不涉及使用自定義IQueryable LINQ 提供程序弄臟我的手?如有必要,我可以進入那個兔子洞,但我想首先確保它是正確的兔子洞。
查看完整描述

1 回答

?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

如果您想在同一Where表達式中同時過濾日志文件名和日志文件內容,我看不到沒有自定義IQueryableLINQ 提供程序的解決方案,因為這正是它們的用例:以智能方式訪問數據方式基于LINQ 查詢中使用的表達式。

也就是說,使用多步驟方法作為折衷方案可能是值得的:

  1. 使用LINQ限制要搜索的日志文件,

  2. 讀取文件和

  3. 使用 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 提供程序。


查看完整回答
反對 回復 2021-10-24
  • 1 回答
  • 0 關注
  • 190 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號