【问题标题】:Dynamic LINQ动态 LINQ
【发布时间】:2009-03-18 20:20:17
【问题描述】:

我有一个这样定义的 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

LINQ 查询

        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 子句 并指定要返回的字段名称?

【问题讨论】:

标签: c# xml linq dynamic


【解决方案1】:
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();

【讨论】:

  • 很接近了;但是选择区域是动态的呢?
【解决方案2】:

看看Dynamic Linq Queries Sample。他们在那里有一个类,为 Where 和 Order By 添加了各种扩展方法

【讨论】:

  • 我已经看过它,并尝试使用它来发挥作用。也许我的用例中的一个例子会更有帮助?
  • 哦,你也需要选择动态,嗯......不知道......但你应该可以用它来摆脱你的开关。
猜你喜欢
  • 2011-04-10
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 2013-03-14
  • 2013-05-07
  • 2016-10-16
  • 2015-11-04
  • 2011-06-13
相关资源
最近更新 更多