动态LINQ多个子句

时间:2010-08-17 11:06:27

标签: c# linq autocomplete where-clause

仍然在努力解决这个问题,而且似乎是围成一圈。

我有以下代码让我疯了。它应填充要在自动填充文本框中使用的项目列表:

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子句中应用相同的逻辑,即供应商,集团,外部。

我真的尝试了很多不同的方法,但我不能为我的生活让事情发挥作用,这让我感到沮丧。

如果有人能提出这样做​​的方法,那么如果我们的路径穿越,你将获得一个大吻或一个大冰霜啤酒。

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

如果在编译时知道要包含/排除的值集(在您的示例中似乎是这种情况),我认为可以使用一个查询来管理:

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

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

答案 2 :(得分:-1)

你的每个Where子句是否只需要包含一个包含标准而一些不包含?

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

答案 3 :(得分:-1)

排序。

var r =来自autocomplete.tblAutoCompletes中的p                         其中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();

我必须在引号中设置异常,因为会话值不合适,并且不会从列表中选择任何内容。

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