0

这种方法:

private async Task readFileInfo(string folderId)

调用了另一个方法:

importCount = await VM.importVehicles(myXDoc);

在此处定义:(注意:我将其从 for 循环更改为 for each,但我得到了类似的结果)。

public async Task<Int32> importVehicles(XDocument importXMLDocument)
{
    var Importedvehicles = from vehicle in importXMLDocument.Descendants("vehicle")
                           select new
                           {
                               VehicleName = vehicle.Element("VehicleName").Value,
                               VehicleYear = vehicle.Element("VehicleYear").Value,
                               Odometer = vehicle.Element("Odometer").Value,
                               LicensePlate = vehicle.Element("LicensePlate").Value,
                               OilWeight = vehicle.Element("OilWeight").Value,
                               OilQuantity = vehicle.Element("OilQuantity").Value,
                               OilFilterModelNumber = vehicle.Element("OilFilterModelNumber"),
                               AirFilterModelNumber = vehicle.Element("AirFilterModelNumber"),
                               OilChangedDate = vehicle.Element("OilChangedDate"),
                               OilChangedOdometer = vehicle.Element("OilChangedOdometer"),
                               NextOilChangeDate = vehicle.Element("NextOilChangeDate"),
                               NextOilChangeOdometer = vehicle.Element("NextOilChangeOdometer"),
                               SettingDistance = vehicle.Element("SettingDistance"),
                               SettingMonths = vehicle.Element("SettingMonths"),
                           };

    Int32 vehicleId;
    vehicleId = await getMaxVehicleId();
    try
    {

        foreach (var item in Importedvehicles)
        {
            vehicle myImportedVehicle = new vehicle();
            myImportedVehicle.VehicleId = vehicleId += 1;
            myImportedVehicle.ImagePath = "Assets/car2.png";
            myImportedVehicle.VehicleName = item.VehicleName;
            myImportedVehicle.VehicleModel = item.VehicleName;


            myImportedVehicle.VehicleYear = short.Parse(item.VehicleYear);
            myImportedVehicle.CurrentOdometer = Convert.ToInt32(item.Odometer);
            myImportedVehicle.LicensePlate = item.LicensePlate;
            myImportedVehicle.LastOilChangedDate = Convert.ToDateTime(item.OilChangedDate.Value.ToString()).ToString("d");
            myImportedVehicle.LastOilChangedOdometer = (Int32)item.OilChangedOdometer;
            myImportedVehicle.ReminderDistance = (Int32)item.SettingDistance;
            myImportedVehicle.ReminderMonths = (Int32)item.SettingMonths;

            vehicleInformation myImportVI = new vehicleInformation();
            myImportVI.OilWeight = item.OilWeight;
            myImportVI.OilAmount = item.OilQuantity;
            myImportVI.OilFilterNumber = item.OilFilterModelNumber.Value.ToString();
            myImportVI.AirFilterNumber = item.AirFilterModelNumber.Value.ToString();

            myImportedVehicle.vehicleInfo = myImportVI;
            m_vehicles.Add(myImportedVehicle);
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message.ToString());
    }

        await SaveList();
        return Importedvehicles.Count();
    }

我收到一个错误:

你调用的对象是空的。

当我单步执行时,它iVehicle会突出显示,但随后会直接转到 for 语句。然后它看起来错误,因为它还没有得到结果iVehicle

4

2 回答 2

1

这并不能 100% 回答您的问题,但它应该给您一个良好的开端。

调试器直接跳到for...loop, 声明之后的原因iVehicle是因为您的查询在声明时没有被执行。因此,此时的 iVehicle 不是匿名类型的集合。

当您调用.Count()时,查询正在执行并iVehicle试图转换为适当的匿名类型集合。但是,因为查询中的某些内容(在您调用 后正在执行.Count())是null,所以您收到的是NullReferenceException.

您应该首先验证importXMLDocument调用的返回值和返回值Descendants()是否不为空。

希望无论如何都会有所帮助。

编辑:

现在你已经给出了一个完整的例子,你有很多地方可能是null.

每次你使用这个:

vehicle.Element("SomeElementNameHere")

那可能是null。然后你调用.Value一个null对象的属性。

您需要确保每个元素都确实存在。隔离每个案例,并确定哪一个是null.

于 2013-02-15T02:07:07.130 回答
1

尝试像这样编写代码:

var query =
    from vehicle in importXMLDocument.Descendants("vehicle")
    select new { ... };

var  iVehicle = query.ToArray();

for (var i = 0; i <= iVehicle.Count(); i++)
{
    ...
}

您需要强制评估查询。这就是.ToArray正在做的事情。查询本身只是查询的定义,而不是结果。

于 2013-02-15T02:12:59.467 回答