2011-07-14 84 views
0

我返回一個列表。這包含XML文件中不能爲空的xml節點的名稱。LINQ語句的WHERE問題

List<Setting> settingList = SettingsGateway.GetBySettingTypeList("VerifyField"); 

我有一個LINQ聲明。我試圖返回所有具有空節點的事務。這裏的列表是返回不能爲空的節點。有人知道我在這裏做錯了嗎?

下面的代碼應該綁定「交易」到DataGrid並顯示事務處理的具有所需要的空節點。

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文件示例:

<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> 
+0

目前尚不清楚爲什麼你」不要在你的內部lambda表達式中使用'name'。 'Setting'看起來像什麼? –

+0

「不能爲空」是什麼意思? – dizzwave

+0

在XML中,節點不能爲空。 – Turp

回答

3

好了,第一個問題:如果元素是失蹤,你會得到一個NullReferenceException。

我建議創建它不能爲空元素的List<string>,使查詢簡單。然後:

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

認爲這應該沒問題了,比你原來的代碼稍微簡單......不過說實話,你的原始代碼看起來像它應該工作反正。它究竟做了什麼?您還沒有關於實際結果與所預計的很清楚...

+0

我更新了我的代碼包含更多信息的SettingType所有行。我添加了更多的實際代碼,向您展示如何選擇節點並將它們綁定到數據網格。我希望這能幫助你,幫助我。 – Turp

1

事情是這樣的:

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")), 
        ... 
    }); 

作品有:

<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> 
+0

如何添加「選擇」類似於我在上面的代碼中添加的內容。我的transactionList綁定到數據視圖,並有ConfirmationNumber'的'兩列'CustomerName' – Turp

+0

追加。選擇方法...我會編輯。 – Tocco

+0

@尼克,可以接受嗎? – Tocco