为每个循环创建XName.Get

时间:2011-07-14 14:00:21

标签: c# asp.net xml linq visual-studio-2010

我有一个LINQ声明。它搜索XML文件。 (请参阅下面的示例)某些节点需要在其中包含信息。 (非空)LINQ语句返回具有空节点的事务,因为这些是必需的。

XML文件示例:

<OnlineBanking>
  <Transactions>
    <Txn>
      <UserName>John Smith</UserName>
      <CustomerStreet>123 Main</CustomerStreet>
      <CustomerStreet2></CustomerStreet2>
      <CustomerCity>New York</CustomerCity>
      <CustomerState>NY</CustomerState>
      <CustomerZip>12345</CustomerZip>
    </Txn>
  </Transactions>
</OnlineBanking>

LINQ声明:

//Start LINQ statement
var transactionList =
    from transactions in root.Elements(XName.Get("Transactions")).Elements().AsEnumerable()
    where transactions.Elements().Any
       (
          el =>
          String.IsNullOrEmpty(el.Value) &&
          elementsThatCannotBeEmpty.Contains(el.Name)
       )
    select transactions;

我的问题:

我在数据库表中有必需的字段(即CustomerStreet,CustomerCity等)。下面我已经硬编码了所需的XName。但是,我希望这个数据库是动态的。

var elementsThatCannotBeEmpty = new HashSet<XName>
{
   XName.Get("CustomerStreet"),
   XName.Get("CustomerCity"),
   XName.Get("CustomerState"),
   XName.Get("CustomerZip")
};

以下是我检索数据库所需字段的方法:

List<Setting> settingList = SettingsGateway.SelectBySettingType("VerifyField");
foreach (Setting SettingValue in settingList)
{
    string strSettingType = setting.SettingType;
}

如何获取数据库结果循环并动态添加XName.Get值?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您正在尝试检查Any()中字符串的settingList是否为空:

if (settingList.Any(
        name => String.IsNullOrEmpty(el.Element(name).Value)
    )

stringXName进行隐式转换,因此您实际上不需要致电XName.Get。 但是,如果您愿意,可以写el.Element(XName.Get(name))