我的 API 查詢的一部分是要在選擇查詢中使用的 ID 陣列。以下是查詢的創建方式:
var budget_query = _context.Budgets
.Where(_ => _.IdOwner == q.IdOwner)
.Where(_ => _.Month >= startdate && _.Month <= enddate)
.Where(_ => _.IsDeleted == 0);
if (q.IsCategory != 1)
budget_query = budget_query.Where(_ => _.IsUncat == 0);
if (q.IdCurrency != null && q.IdCurrency != 0)
budget_query = budget_query.Where(_ => _.IdCurrency == q.IdCurrency);
if (q.IdTagSel.Length > 0)
foreach (var sel in q.IdTagSel)
budget_query = budget_query.Where(_ => _.IdTag == sel);
它導致空回應,因為顯然一條記錄的欄位不能有許多不同的值,在這種情況下,它會創建 SQL 查詢,如:
SELECT * FROM budgets WHERE IdTag = value1 AND IdTag = value2, etc
然而,我希望得到這樣的結果:
SELECT * FROM budgets WHERE (IdTag == value1 OR IdTag == value2)
有沒有什么簡單的方法可以使用 LINQ 運算式來實作這一點?
編輯
在表達方式的情況下,它對我有用:
budget_query = budget_query.Where(_ => q.IdTagSel.Any(x=>x ==_.IdTag));
但是當我嘗試將它用于我的第二個查詢時,在以下代碼中具有相同的索引:
var trans_query = _context.Transactions
.Where(_ => _.TransactionDate > startdate && _.TransactionDate < enddate)
.Where(_ => _.IsDeleted == 0)
.Where(_ => _.IdOwner == q.IdOwner)
.Where(_ => _.IsCredit == q.IsIncome);
if (q.IdTagSel.Length > 0)
trans_query = trans_query.Where(_ => q.IdTagSel.Any(y => y == _.IdTag));
if (q.IdCurrency != null && q.IdCurrency != 0)
trans_query = trans_query.Where(_ => _.IdCurrency == q.IdCurrency);
var trans = trans_query.OrderBy(_ => _.TransactionDate).ToList();
我收到以下例外:
"The LINQ expression 'DbSet<Transaction>()\n .Where(t => t.TransactionDate > __startdate_0 && t.TransactionDate < __enddate_1)\n .Where(t => (int)t.IsDeleted == 0)\n .Where(t => t.IdOwner == __q_IdOwner_2)\n .Where(t => (Nullable<int>)(int)t.IsCredit == __q_IsIncome_3)\n .Where(t => __q_IdTagSel_4\n .Any(y => (Nullable<int>)y == t.IdTag))' could not be translated.
我嘗試除錯它,一切看起來都很好——所有本地人都很好,并且與第一種情況相同。現在,我真的很困惑。任何想法可能導致這種差異?
uj5u.com熱心網友回復:
任何Where(...)創造AND條件。你需要的是改變你的foreach條件。不確定哪個適合 EF.Any()Contains()
if (q.IdTagSel.Length > 0)
budget_query = budget_query.Where(_ => q.IdTagSel.Contains(_.IdTag));
//--- or
if (q.IdTagSel.Length > 0)
budget_query = budget_query.Where(_ => q.IdTagSel.Any(x => x == _.IdTag));
那應該創造
SELECT * FROM budgets WHERE IdTag IN (value1, value2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/460842.html
下一篇:LINQ-如何從多個表中獲取資料
