1

2 つの別々の XML ファイルに対して実行しようとしている結合で、本当に問題が発生しています。

XML ファイルから抽出した各オブジェクトを記述する 2 つのクラスがあります。

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

最後のクラスには、2 つのデータ セットに対して実行した結合が格納されます。

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 ファイルから情報をロードする 2 つのメソッドであり、3 番目のメソッドは結合を実行し、情報を 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
                    };
4

1 に答える 1

1

join使用するのではなく、次のものだけを使用しようとしましたか:

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

このようなクエリでLoadXMLOrders()は、顧客ごとにもう一度呼び出すことができることに注意してください。そのため、最初に事前に保存してください。

ToArray()/を呼び出すクエリを具体化することも忘れないでくださいToList()

于 2012-10-19T02:39:16.867 に答える