首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ语句中的问题

LINQ语句中的问题
EN

Stack Overflow用户
提问于 2011-07-14 17:23:59
回答 2查看 151关注 0票数 0

我要还给你一份名单。这是包含在我的xml文件中不能为空的XML节点的名称。

代码语言:javascript
复制
List<Setting> settingList = SettingsGateway.GetBySettingTypeList("VerifyField");

我有一份LINQ声明。我试图返回所有有空节点的事务。这里的列表返回不能为空的节点。有人知道我在这里做错了什么吗?

下面的代码应该将“事务”绑定到DataGrid,并显示具有所需的空节点的Txn。

代码语言:javascript
复制
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)
    settingList.Any(
        name => String.IsNullOrEmpty(el.Element(name.SettingValue).Value)
    )
)
select new
{
    CustomerName = transactions.Element(XName.Get("CustomerName")).Value,
    ConfirmationNumber = transactions.Element(XName.Get("ConfirmationNumber")).Value
 };

 GridView.DataSource = transactionList;
 GridView.DataBind();

XML文件示例:

代码语言:javascript
复制
<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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-14 17:37:57

好的,第一个问题:如果元素丢失了,您将得到一个NullReferenceException。

我建议为不能为null的元素创建一个List<string>,以简化查询。然后:

代码语言:javascript
复制
var requiredElements = settingList.Select(x => x.SettingValue).ToList();

var transactionList = root
      .Elements("Transactions")
      .Elements("Txn")
      .Where(x => requiredElements
                    .Any(name => string.IsNullOrEmpty((string) x.Element(name)));

我觉得这应该可以,而且比你原来的代码简单一点.但是老实说,你的原始代码看起来应该起作用了。它到底做了什么?你还不清楚实际的结果和预期的结果.

票数 3
EN

Stack Overflow用户

发布于 2011-07-14 17:58:22

就像这样:

代码语言:javascript
复制
var transactionList =
     root
    .Elements(XName.Get("Transactions")) //Get <Transaction> elements
    .Elements() //Get <Txn> elements
    .Where(txn => txn.Elements().Any(e => e.Value == String.Empty))  //Filter <Txn> Elements if it have any element like this: <CustomerStreet2></CustomerStreet2>
    .Select(x => new {
        PropertyX = x.Element(XName.Get("UserName")),
        PropertyY = x.Element(XName.Get("CustomerStreet")),
                    ...
    });

与以下方面合作:

代码语言:javascript
复制
<OnlineBanking>
  <Transactions>
    <Txn> <!-- This one matches! -->
      <UserName>John Smith</UserName>
      <CustomerStreet>123 Main</CustomerStreet>
      <CustomerStreet2></CustomerStreet2> 
      <CustomerCity>New York</CustomerCity>
      <CustomerState>NY</CustomerState>
      <CustomerZip>12345</CustomerZip>
    </Txn>
    <Txn> <!-- This one doesn't match! -->
      <UserName>John Smith</UserName>
      <CustomerStreet>123 Main</CustomerStreet>
      <CustomerStreet2>ASDASD</CustomerStreet2>
      <CustomerCity>New York</CustomerCity>
      <CustomerState>NY</CustomerState>
      <CustomerZip>12345</CustomerZip>
    </Txn>
  </Transactions>
</OnlineBanking>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6697399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档