【问题标题】:Dynamic LINQ Multiple Where Clause动态 LINQ 多个 Where 子句
【发布时间】: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


【解决方案1】:

不完全确定你的问题在这里,但如果你想排除,那么代码不应该是这样的

 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);

【讨论】:

    【解决方案2】:

    如果在编译时知道要包含/排除的一组值(如您的示例中的情况),我认为这可以通过一个查询来管理:

    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();
    

    为简洁起见,我删除了几个案例。

    【讨论】:

      【解决方案3】:

      难道不是每个 Where 子句都只需要包含一个 Contains 条件和一些 Not Contains 吗?

      if (inhouse == "Inhouse")
           r = r.Where(p => p.Contains(inhouse) && !p.Contains("Supplier") && !p.Contains("Group") && !p.Contains("External"));
      

      【讨论】:

        【解决方案4】:

        已排序。

        var r = from p in autocomplete.tblAutoCompletes 其中 p.MemberId == memberid && p.LocationId == locationid && p.ACItem.Contains(prefixText) 选择 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();
        

        我不得不将例外设置在引号中,因为会话值不合适并且不会从列表中挑选出任何内容。

        感谢所有贡献和帮助我的人。

        【讨论】:

        • 哦,好吧,没有啤酒,没有吻 :( - 很高兴你把它整理好了 :)
        • Jim - 请留意我的问题。对所有这一切都非常陌生,因此有更多啤酒和亲吻的机会!!!
        猜你喜欢
        • 2023-03-29
        • 2010-10-10
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        • 2016-06-21
        相关资源
        最近更新 更多