Динамический LINQ - PullRequest
       7

Динамический LINQ

2 голосов
/ 18 марта 2009

У меня есть XML-документ, определенный так

Файл XML

<TABLE>
    <RECORD>
        <PAGENUMBER> 1 Of 1</PAGENUMBER>
        <OtherFields1>..</OtherFields1>
        <OtherFields2>..</OtherFields2>
    </RECORD>
    <RECORD>
        <PAGENUMBER> 1 Of 2</PAGENUMBER>
        <OtherFields1>..</OtherFields1>
        <OtherFields2>..</OtherFields2>
    </RECORD>
    <RECORD>
        <PAGENUMBER> 2 Of 2</PAGENUMBER>
        <OtherFields1>..</OtherFields1>
        <OtherFields2>..</OtherFields2>
    </RECORD>
    <RECORD>
        <PAGENUMBER> 1 Of 1</PAGENUMBER>
        <OtherFields1>..</OtherFields1>
        <OtherFields2>..</OtherFields2>
    </RECORD>
</TABLE>

Я пытаюсь создать динамический запрос, в который я могу поместить "Имя поля", "Операнд", "Значение" в конфигурации, и LINQ может построить предикат на его основе.

Файл конфигурации

<CLAUSES>
    <CLAUSE name="PAGENUMBER" operand="!=">Page 1 Of 1</CLAUSE>
    <CLAUSE name="OtherFields1" operand="!=">String.Empty</CLAUSE>
</CLAUSES>

Вот ссылка, которую я сейчас использую

LINQ Query

        XDocument jobXML = XDocument.Load(JobFile);

        List<ClauseObj> clauses = new List<ClauseObj>();
        clauses.Add(new ClauseObj { Field = "PAGENUMBER", Operand = "!=", Value = " Page 1 Of 1" });

        var q = jobXML.Descendants("RECORD").AsEnumerable();

        foreach (var c in clauses)
        {
            switch (c.Operand)
            {
                case "!=":
                    q = q.Where(r => r.Element(c.Field).Value != c.Value);
                    break;
            }
        }

как я могу сделать так, чтобы предложения "динамически" читали предложения where а также укажите, какие имена полей возвращать?

Ответы [ 2 ]

1 голос
/ 18 марта 2009
string clause = "PAGENUMBER";
string operand = "!=";
string value= " Page 1 Of 1";

  var q = from r in jobXML.Descendants("RECORD")
                 select new
                 {
                     PAGENUMBER = (string)r.Element("PAGENUMBER"),
                     OtherFields1 = (string)r.Element("OtherFields1")
                 }

   switch(operand)
   {
       case "!=":
          q = q.Where(r=> r.Element(clause).Value != value);
          break;
       case "etc":
   }

   var list = q.ToList();
1 голос
/ 18 марта 2009

Взгляните на образец динамических запросов Linq . Там есть класс, который добавляет различные методы расширений для Where и Order By

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...