我想在 IQueryable 陳述句中執行 Where 子句,以便在資料庫端完成而不是在客戶端進行選擇。我現在擁有的代碼是:
var all = await session.Query<Instance>()
.ToListAsync()
.ConfigureAwait(false);
var insts = all.Where(i => ruleInstances.Contains(i.Name,
new ComparerExtension<string>(
(x, y) => string.Compare(x, y, StringComparison.OrdinalIgnoreCase) == 0,
h => h.ToLower().GetHashCode())));
哪個在客戶端進行選擇。
理想情況下,我將能夠撰寫 IQueryable 如下:
var all = await session.Query<Instance>()
.Where(i => ruleInstances.Contains(i.Name,
new ComparerExtension<string>(
(x, y) => string.Compare(x, y, StringComparison.OrdinalIgnoreCase) == 0,
h => h.ToLower().GetHashCode())))
.ToListAsync()
.ConfigureAwait(false);
但是,這種理想的編碼不起作用。我得到一個例外:“無法理解運算式......”指的是整個 where 子句。
現在我相信我需要將ruleInstances.Contains(...)方法表達為運算式樹。
我將不勝感激幫助設定它。
謝謝你。
uj5u.com熱心網友回復:
您的實體化和呼叫ComparerExtension無法在服務器端完成,因此無法轉換為在服務器端運行。請注意,最后,庫必須創建一條 SQL 陳述句以發送到服務器,并且沒有任何功能或類似功能。如果您需要在服務器端進行不區分大小寫的比較,您必須確保服務器使用正確的資料庫排序規則(例如 SQL_Latin1_General_CP1_CI_AS),在這種情況下,您可以發送:
.Where(i => ruleInstances.Contains(i.Name))
如果這真的有效,取決于 ruleInstances 的型別。也許您必須將其轉換為一個簡單的字串串列并使用它:
var ruleInstanceNames = ruleInstances.Select(rule => rule.Name).ToList();
... .Where(i => ruleInstanceNames.Contains(i))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/335997.html
