需求:查詢問題列表,其中查詢條件之一是“問題狀態”,多選。於是需要用到or。
解決過程:百度了,試過最笨的方法:在for循環裏將遍歷每個“狀態”值匹配,再用Union拼接起來。但結果不理想,不知道爲什麼linq to EF最後執行的結果與它輸出的SQL語句(ToString())在SQL SERVER查詢分析器裏執行的結果爲什麼不一樣。頁面執行的結果總是隻匹配出最後一個“狀態”值的數據。
String[] status_arr = sta.Split(new Char[] { ',' });
Int16 theStatus =0;
IQueryable<sys_updateJob> results0 = rlist;
for (int i = 0; i < status_arr.Count(); i++)
{
theStatus = Int16.Parse(status_arr[i].ToString());
IQueryable<sys_updateJob> results = results0;
results = results.Where(u => u.Status == theStatus);
if (i == 0)
{
rlist = results;
}
rlist = rlist.Union(results);}
//結果總是隻匹配出最後一個“狀態”值的數據。
也嘗試了使用where_or,但結果與上面的一樣。
Int16 theStatus = 0;
var where_or = myClass_static.False<sys_updateJob>();
for (int i = 0; i < status_arr.Count(); i++)
{
theStatus = Int16.Parse(status_arr[i]);
where_or = where_or.Or(q => q.Status == theStatus);
}
IEnumerable<sys_updateJob> results = rlist.Where(where_or.Compile());
rlist = results.AsQueryable();
最後是看到以下文章(https://blog.csdn.net/shujudeliu/article/details/50264677)的最後部分得到啓示,改爲Contains方法:
Int16 theStatus = 0;
if (sta.IndexOf(",") == -1)
{
theStatus = Int16.Parse(sta);
rlist = rlist.Where(q => q.Status == theStatus);
}
else
{
String[] status_arr = sta.Split(new Char[] { ',' });Int16[] staArray = new Int16[status_arr.Length];
Int16 staVal = 0;
for (int i = 0; i < status_arr.Count(); i++)
{
staVal = Int16.Parse(status_arr[i]);
staArray[i] = staVal;
}
//Any-->EXISTS
//rlist = rlist.Where(uj => staArray.Any(u => u == uj.Status));
//Contains-->IN
//由於status_arr變量數組的個數不會太多,所以選擇使用Contains
rlist = rlist.Where(uj => staArray.Contains(uj.Status));
}
完畢。