使用Queryable.OrderBy使用DBNull对值进行排序,它会抛出异常

时间:2013-07-24 05:27:59

标签: c# wpf linq

当我尝试使用DBNull使用Queryable.OrderBy对值进行排序时,它会抛出异常。

    Pet[] pets =
        {
            new Pet {Name = "Barley", Age = 8},
            new Pet {Name = DBNull.Value, Age = 1},
            new Pet {Name = "Boots", Age = 4}
        };

    // Sort the Pet objects in the array by Pet.Name
    IEnumerable<Pet> query = pets.AsQueryable().OrderBy(pet => pet.Name);
    foreach (Pet pet in query)
        Console.WriteLine("{0} - {1}", pet.Name, pet.Age);

下面的代码抛出异常,因为我正在使用DBNull。我知道我可以使用下面的代码克服这个问题,

   IEnumerable<Pet> query = pets.AsQueryable().OrderBy(delegate(Pet pet)
            {
                if (pet.Name is DBNull)
                    return null;
                return pet.Name;
            });

但我无法使用此代码。有没有办法处理这个问题,而无需在OrderBy函数中添加条件检查。

3 个答案:

答案 0 :(得分:2)

DBNull是旧数据技术的一部分。 Linq&amp; EF不再需要DBNull。只需使用null。

Pet[] pets =
    {
        new Pet {Name = "Barley", Age = 8},
        //Using null is fine
        new Pet {Name = null, Age = 1}, 
        new Pet {Name = "Boots", Age = 4}
    };

// Sort the Pet objects in the array by Pet.Name
IEnumerable<Pet> query = pets.AsQueryable().OrderBy(pet => pet.Name);
foreach (Pet pet in query)
    Console.WriteLine("{0} - {1}", pet.Name, pet.Age);

答案 1 :(得分:0)

我已经运行了代码并获得了一个例外:

At least one object must implement IComparable.

那是因为我不知道Name是什么类型。我猜它是什么,它没有实现IComparable。您的CustomClassName上的课程)应该实施IComparable<T>界面,或者您应该在IComparer上传递OrderBy()

答案 2 :(得分:0)

我使用了以下代码。由于Querable.OrderBy默认情况下不能与DBNull一起使用。我们必须使用变通方法。 IEnumerable query = pets.AsQueryable()。OrderBy(delegate(Pet pet){if(pet.Name is DBNull)return null; return pet.Name;});