动态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,因为会话值不合适,并且不会从列表中选择任何内容。

感谢所有那些贡献并帮助我的人。