【发布时间】:2010-08-17 11:06:27
【问题描述】:
仍然在为此苦苦挣扎,似乎在兜圈子。
下面的代码让我抓狂。它应该填充要在自动完成文本框中使用的项目列表:
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 子句,即供应商、组、外部。
我真的尝试了很多不同的方法,但我这辈子都无法让事情发挥作用,这让我有些沮丧。
如果有人能提出一个这样做的方法,如果我们的道路相交,你要么得到一个大大的吻,要么得到一大杯冰镇啤酒。
【问题讨论】:
-
我不明白你的目标,如果
ACItem包含前缀文本,那么你肯定想要所有这样做的条目。其次,人们会从您的代码中假设 ACItem 是从您的对象返回的字符串,因此除非 ACItem 是“Inhouse”、“Supplier”、“Group”或“External”,否则后续比较将失败。实际上,您正在创建一个例程来为 4 个单词提供自动完成功能。我怀疑 ACItem 是否比字符串更复杂? -
除此之外,您的订单无济于事——您需要
r = r.OrderBy(p => p); -
你好拉撒路(顺便说一句,从死里复活做得很好,很好的回来)。 ACItem 是包含要返回的自动完成项列表的列。我的场景包括用户偏好(通过会话),我可能想限制用户也可以访问的内容。因此,如果不允许他们查看 Inhouse,自动完成列表将不会显示这些项目。如果这不可能,或者对于像我这样的傻瓜来说非常棘手,我可能会最终将它们留在列表中,并在他们选择项目后进行一些验证。
标签: c# linq autocomplete where-clause