簡體   English   中英

LINQ to XML連接問題

[英]LINQ to XML join issue

我在嘗試對兩個單獨的XML文件執行聯接時遇到了真正的麻煩。

我有兩個類描述從XML文件提取的每個對象,它們是

public class XMLCustomers
{
    public String CustomerID { get; set; }
    public String ContactName { get; set; }
}

public class XMLOrders
{
    public String OrderID { get; set; }
    public String CustomerID { get; set; }
    public String OrderDate { get; set; }
    public String ShippedDate { get; set; }
    public String Freight { get; set; }
    public String ShipName { get; set; }
    public String ShipCity { get; set; }
    public String ShipCountry { get; set; }
}

我的上一課存儲了我在兩組數據上執行的聯接。

public class PostXMLJoinOrder
{
    public String OrderID { get; set;}
    public String ContactName { get; set;}
    public String OrderDate { get; set;}
    public String ShippedDate { get; set;}
    public String Freight { get; set;}
    public String ShipName { get; set;}
    public String ShipCity { get; set;}
    public String ShipCountry { get; set;}
}

最后,這是我的兩個方法,它們從XML文件中加載信息,第三個方法執行聯接並將信息存儲在IEnumerable中。

        public IEnumerable<XMLCustomers> LoadXMLCustomers() {
        var custs = from x in XElement.Load(System.Web.HttpContext.Current.Server.MapPath(@"~\App_Data\XCustomers.xml")).Elements()
                    select new XMLCustomers
                    {
                        ContactName = x.Attribute("ContactName").Value,
                        CustomerID = x.Attribute("CustomerID").Value

                    };
        int size = custs.Count();
        return custs;
    }

    public IEnumerable<XMLOrders> LoadXMLOrders() {
        var ords = from x in XElement.Load(System.Web.HttpContext.Current.Server.MapPath(@"~\App_Data\XOrders.xml")).Elements()
                    select new XMLOrders
                    {

                        OrderID = x.Attribute("ContactName").Value,
                        CustomerID = x.Attribute("CustomerID").Value,
                        OrderDate = x.Attribute("OrderDate").Value,
                        ShippedDate = x.Attribute("ShippedDate").Value,
                        Freight = x.Attribute("Freight").Value,
                        ShipName = x.Attribute("ShipName").Value,
                        ShipCity = x.Attribute("ShipCity").Value,
                        ShipCountry = x.Attribute("ShipCountry").Value
                    };
        int size = ords.Count();
        return ords;

    }


    public IEnumerable<PostXMLJoinOrder> LoadPostXMLJoinOrders() {
        var joinQuery = from customer in LoadXMLCustomers()
                        from orders in LoadXMLOrders()
                        where customer.CustomerID == orders.CustomerID
                        select new PostXMLJoinOrder
                        {

                            OrderID = orders.OrderID,
                            ContactName = customer.ContactName,
                            OrderDate = orders.OrderDate,
                            ShippedDate = orders.ShippedDate,
                            Freight = orders.Freight,
                            ShipName = orders.ShipName,
                            ShipCity = orders.ShipCity,
                            ShipCountry = orders.ShipCountry

                        };
        return joinQuery;


    }

我已經測試了從LINQ返回的項目數量,該數量仍為0; 我已經仔細檢查了文件中正在加載的所有內容,但似乎無法解決問題。

編輯:其加載問題。 XML文件肯定存儲在正確的App_Data文件夾下。 但是,當個別LoadXMLCustomers()運行時,我在lINQ語句選擇並創建新的Loaded Customer對象的部分得到了NullReferenceException。

我已經確保XML文檔的構建內容正確並且將copyToOutputDirectory設置為較新的版本

這是一個例外,而且var值是null,因此由於某些原因,它肯定不會加載: 異常截圖

解決:我在這里學到的教訓是,您需要密切注意XML和數據。 如果您的某些XML數據具有空值,則需要通過確保select語句可以處理它來進行說明。

上面我有代碼

                    select new XMLOrders
                {

                    OrderID = x.Attribute("ContactName").Value,
                    CustomerID = x.Attribute("CustomerID").Value,
                    OrderDate = x.Attribute("OrderDate").Value,
                    ShippedDate = x.Attribute("ShippedDate").Value,
                    Freight = x.Attribute("Freight").Value,
                    ShipName = x.Attribute("ShipName").Value,
                    ShipCity = x.Attribute("ShipCity").Value,
                    ShipCountry = x.Attribute("ShipCountry").Value
                };

實際上應該包括對字符串值的強制轉換,因此,如果數據為空,則不會拋出null異常。 其次,我應該獲取元素值而不是屬性值。

                    select new XMLOrders
                    {

                        OrderID = (string)x.Element("OrderID").Value,
                        CustomerID = (string)x.Element("CustomerID").Value,
                        OrderDate = (string)x.Element("OrderDate").Value,
                        ShippedDate = (string)x.Element("ShippedDate").Value,
                        Freight = (string)x.Element("Freight").Value,
                        ShipName = (string)x.Element("ShipName").Value,
                        ShipCity = (string)x.Element("ShipCity").Value,
                        ShipCountry = (string)x.Element("ShipCountry").Value
                    };

您是否嘗試過不使用join而是:

from customer in LoadXMLCustomers()
from order in LoadXMLOrders()
where customer.CustomerID = order.CustomerID
select new PostXMLJoinOrder
...

請注意,在這樣的查詢中,可以為每個客戶再次調用LoadXMLOrders() 因此,請先預先保存。

同樣不要忘記實現調用ToArray() / ToList()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM