2013-12-24 5 views
0

Я использую xml-файл this. Я думаю, что что-то пропустил. Потому что ничего не происходит. Просто появляется пустая страница. Что я снова делаю неправильно. Как я могу привязать отфильтрованные данные в GridViewФильтр Linqtoxml не работает

protected void Page_Load(object sender, EventArgs e) 
{ 
    XElement root = XElement.Load(Server.MapPath("PurchaseOrders.xml")); 
    IEnumerable<XElement> purchaseOrders = 
     from el in root.Elements("PurchaseOrder") 
     where 
      (from add in el.Elements("Address") 
      where 
       (string)add.Attribute("Type") == "Shipping" && 
       (string)add.Element("State") == "NY" 
      select add) 
      .Any() 
     select el; 
    foreach (XElement el in purchaseOrders) 
    { 
     GridView1.DataSource = el; 
    } 
    GridView1.DataBind(); 
} 

ответ

0

вы в настоящее время ищете элементов в безымянном пространстве имен - в то время как файл, который вы связаны с имеет пространство имен URI из "http://www.adventure-works.com" для элементов, которые вы ищете.

Просто используйте:

XNamespace aw = "http://www.adventure-works.com"; 
IEnumerable<XElement> purchaseOrders = 
from el in root.Elements(aw + "PurchaseOrder") 
where 
    (from add in el.Elements(aw + "Address") 
    where 
     (string)add.Attribute("Type") == "Shipping" && 
     (string)add.Element(aw + "State") == "NY" 
    select add) 
    .Any() 
select el; 

Или чуть более просто, IMO:

XNamespace aw = "http://www.adventure-works.com"; 
IEnumerable<XElement> purchaseOrders = 
    root.Elements(aw + "PurchaseOrder") 
     .Where(order => order.Elements(aw + "Address") 
       .Any(add => (string) add.Attribute(aw + "Type") == "Shipping" 
          && (string) add.Element(aw + "State") == "NY")); 

(в основном это не использовать выражения запроса, потому что они на самом деле не помогает вам здесь, и я м с использованием перегрузки Any, которая берет предикат ...)

Смежные вопросы