您好我正在尝试使用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。它不能是一种特定的类型,因为扩展类型必须支持所有类型的结构,我不能改变这种设计,因为它背后有一些原因(对于真实的数据结构)。
答案 0 :(得分:3)
您有两种选择:
首选方法是更改课程设计。当您知道该值为object
实例时,我认为没有任何理由使用CarExtension
,除非这是一个您无法更改的大项目。
如果您无法更改设计,可以检查查询中对象的类型:
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();