Динамическое предложение LINQ Multiple Where - PullRequest
1 голос
/ 17 августа 2010

Все еще действительно борется с этим и, кажется, вращается по кругу.

У меня есть следующий код, который сводит меня с ума. Он должен заполнить список элементов, которые будут использоваться в текстовом поле автозаполнения:

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 ]

1 голос
/ 17 августа 2010

Не совсем уверен в вашей проблеме здесь, но если вы хотите исключить, то не должен ли код быть чем-то вроде

 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);
0 голосов
/ 17 августа 2010

отсортирован.

var r = из p в 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();

Я должен был установить исключение в кавычках, поскольку vlaue сеанса было неуместным и ничего не выбрал бы из списка.

Спасибо всем, кто помог мне.

0 голосов
/ 17 августа 2010

Если набор значений для включения / исключения известен во время компиляции (как это имеет место в вашем примере), я думаю, что это можно сделать одним запросом:

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

Для краткости я исключил пару случаев.

0 голосов
/ 17 августа 2010

Разве каждое из ваших положений "Где" просто должно содержать критерии "Содержит", а некоторые "Не содержит"?

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