Linq to EF動態拼接or條件,最後使用Contains解決。

需求:查詢問題列表,其中查詢條件之一是“問題狀態”,多選。於是需要用到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));
                    }

完畢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章