动态LINQ多个子句
仍然真的在与此斗争,似乎是围成一圈。
我有以下代码让我疯了。 它应填充要在自动填充文本框中使用的项目列表:
public string[] GetAutoComplete(string prefixText, int count) { string memberid = HttpContext.Current.Session["MemberID"].ToString(); string locationid = HttpContext.Current.Session["LocationID"].ToString(); string inhouse = HttpContext.Current.Session["Inhouse"].ToString(); string supplier = HttpContext.Current.Session["Supplier"].ToString(); string groupw = HttpContext.Current.Session["Group"].ToString(); string external = HttpContext.Current.Session["External"].ToString(); MyEnts autocomplete = new MyEnts(); var r = from p in autocomplete.tblAutoCompletes where p.MemberId == memberid && p.LocationId == locationid && p.ACItem.Contains(prefixText) select p.ACItem; if (inhouse == "Inhouse") r = r.Where(p => p == inhouse); if (supplier == "Supplier") r = r.Where(p => p == supplier); if (groupw == "Group") r = r.Where(p => p == groupw); if (external == "External") r = r.Where(p => p == external); r.OrderBy(p => p); return r.ToArray();
我试图使用动态where子句检索以下行。
如果inhouse =“Inhouse”,则项目列表应包含“Inhouse”一词。 如果是inhouse!=“Inhouse”,则应从列表中排除“Inhouse”一词。
然后应该在不同的where子句中应用相同的逻辑,即供应商,集团,外部。
我真的尝试了很多不同的方法,但我不能为我的生活让事情发挥作用,这让我感到沮丧。
如果有人能提出这样做的方法,那么如果我们的路径穿越,你将会得到一个大吻或一个大冰霜啤酒。
不完全确定你的问题在这里,但如果你想排除那么不应该代码是这样的
if (inhouse == "Inhouse") r = r.Where(p => p == inhouse); else r = r.Where(p => p != inhouse);
哦! 如果你想要排除,那么代码应该是类似的
if (inhouse != "Inhouse") r = r.Where(p => p != inhouse);
如果在编译时知道要包含/排除的值集(在您的示例中似乎是这种情况),我认为可以使用一个查询来管理:
string memberid = HttpContext.Current.Session["MemberID"].ToString(); string inhouse = HttpContext.Current.Session["Inhouse"].ToString(); string supplier = HttpContext.Current.Session["Supplier"].ToString(); bool includeInHouse = (inhouse == "Inhouse"); bool includeSupplier = (supplier == "Supplier"); MyEnts autocomplete = new MyEnts(); var r = from p in autocomplete.tblAutoCompletes where (p.MemberId == memberid && p.LocationId == locationid && p.ACItem.Contains(prefixText)) && (includeInHouse || (p.ACItem != "InHouse")) && (includeSupplier || (p.ACItem != "Supplier")) select p.ACItem; r.OrderBy(p => p.ACItem); return r.ToArray();
为简洁起见,我已经删除了几个案例。
你的每个Where子句都不需要包含一个包含标准而一些不包含吗?
if (inhouse == "Inhouse") r = r.Where(p => p.Contains(inhouse) && !p.Contains("Supplier") && !p.Contains("Group") && !p.Contains("External"));
排序。
var r = from p in autocomplete.tblAutoCompletes其中p.MemberId == memberid && p.LocationId == locationid && p.ACItem.Contains(prefixText)select p.ACItem;
if (inhouse != "Inhouse") r = r.Where(p => p != "Inhouse"); if (supplier != "Supplier") r = r.Where(p => p != "Supplier"); if (groupw != "Group") r = r.Where(p => p != "Group"); if (external != "External") r = r.Where(p => p != "External"); r = r.OrderBy(p => p); return r.ToArray();
我不得不在引号中设置exception,因为会话值不合适,并且不会从列表中选择任何内容。
感谢所有那些贡献并帮助我的人。