使用linq确定Object类型的内部属性是否具有等于输入的car number

时间:2018-05-17 10:24:23

标签: c# linq

您好我正在尝试使用linq来解决以下问题。

简化示例:

public class Car 
{    
    public string Number { get; set; }
    public object Extension { get; set; }
}

public class CarExtension
{
    public string SpecialNumber { get; set; }
}

我需要能够使用linq查询Car对象并确定SpecialNumber是否等于我的输入。
问题是我没有CarExtension课程。 我只有"object"类型。

所以我不能像这样使用linq:

var item = cars.Where(x => x.Extension.SpecialNumber == input);

编辑:我应该提到的重要细节是 - 我不知道运行时的CarExtension类型。

理想的解决方案是在代码中没有CarExtension。 所以我以后可以使用这个函数,即使它将是一个不同的扩展类型,也将具有SpecialNumber属性。

P.S。我用它来查询mongodb。它不能是一种特定的类型,因为扩展类型必须支持所有类型的结构,我不能改变这种设计,因为它背后有一些原因(对于真实的数据结构)。

3 个答案:

答案 0 :(得分:3)

您有两种选择:

  1. 首选方法是更改​​课程设计。当您知道该值为object实例时,我认为没有任何理由使用CarExtension,除非这是一个您无法更改的大项目。

  2. 如果您无法更改设计,可以检查查询中对象的类型:

    var item = cars
        .Where(x => x.Extension is CarExtension
                 && ((CarExtension)x.Extension).SpecialNumber == input);
    

    使用C#7(需要Visual Studio 2017),可以使用模式匹配重写:

    var item = cars
        .Where(x => x.Extension is CarExtension carExtension
                 && carExtension.SpecialNumber == input);
    

答案 1 :(得分:0)

您应该这样做,因为您已经知道扩展名为CarExtension

var item = cars.Where(x => (x.Extension as CarExtension)?.SpecialNumber == input);

答案 2 :(得分:0)

您可以将对象扩展转换为CarExtension

            List<Car> cars = new List<Car>();
            Car r = new Car() { Number = "1", Extension = new CarExtension() { SpecialNumber = "5" } };
            cars.Add(r);
            var l = cars.Where(x => ((CarExtension)x.Extension).SpecialNumber == "5").ToList();