我有一個帶有 string/varchar 屬性的表。
我的方法接受一個字串,它可以是一個逗號分隔的串列。
我的目標是構建一個動態 where 子句,它將回圈遍歷逗號分隔的串列,并使用我的查詢創建一個 where 子句,但我沒有得到正確的語法。
public async List<DataObj> GetData(string pets)
{
IQueryable<DataObj> query = dbSet;
if (!string.IsNullOrEmpty(pets))
{
var split = pets.Split(",");
foreach (var t in split)
{
query = query.Where(x => x.Pets.Contains(t.Trim()));
}
}
return await query.DataObj.AsNoTracking().ToListAsync();
}
因此,如果一條記錄的 DataObj.Pets 是“狗,貓”。而 DataObj.Pets 的另一項記錄是:“狗,鳥”。
如果我輸入“birds”作為 repo 的引數,它應該回傳 DataObj2,如果我輸入“dog”,它應該回傳兩個,如果我輸入“dog, Birds”,查詢應該回傳 DataObj1 和 DataObj2 .
我的查詢有什么問題嗎,因為它沒有這樣做。
uj5u.com熱心網友回復:
如果我輸入“birds”作為 repo 的引數,它應該回傳 DataObj2,如果我輸入“dog”,它應該回傳兩個,如果我輸入“dog, Birds”,查詢應該回傳 DataObj1 和 DataObj2 .
您的要求是針對Or條件,通過鏈接Where運算式您正在使用And條件
您可以使用謂詞構建器或動態 LINQ 來構建多個Or條件。
只是為了好玩 - 您可以使用異步方法
public async Task<List<DataObj>> GetData(string pets)
{
if (string.IsNullOrEmpty(pets)) return new List<DataObj>();
var tasks = pets.Split(",")
.Select(p => context.DataObects.Where(o => o.Pets.Contains(p)).ToListAsync())
.ToArray();
await Task.WhenAll(tasks);
return tasks.SelectMany(t => t.Result).ToList();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/313319.html
