【发布时间】:2017-11-27 15:53:09
【问题描述】:
我有一个简单的表格“汽车”:
IdCar | Name | Id_Base
1 Toyota null
2 Honda 5
3 Ford 4
4 Buick null
5 Volvo 1
Id_Base 是对该表Cars 的IdCar 字段的引用。所以这就像一个循环引用。我知道这很奇怪,但我什么都做不了。
我有一个CarDTO:
public class CarDTO
{
public int IdCar { get; set; }
public int? Id_Base { get; set; }
public string Name { get; set; }
public CarDto InnerCar {get; set; }
}
如果Id_Base 是NOT NULL,我的目标是将表Cars 的每个元素投影到CarDTO。那就是我通过它的IdCar 得到一个Car 并填充CarDTO 的InnerCar 属性。
所以如意的结果应该是这样的:
new Car(){ IdCar = 1, Name = "Toyota", Id_Base = null},
new Car(){ IdCar = 2, Name = "Honda", Id_Base = 5,
InnerCar = new Car(){ IdCar = 5, Name="Volvo" }},
new Car(){ IdCar = 3, Name = "Ford", Id_Base = 4,
InnerCar = new Car(){ IdCar = 4, Name="Buick" }},
new Car(){ IdCar = 4, Name = "Buick", Id_Base = null },
new Car(){ IdCar = 5, Name = "Volvo", Id_Base = 1,
InnerCar = new Car(){ IdCar = 5, Name="Toyota" }}
我尝试过的:
var cars = from car in db.Cars
let innerCar =
(from inCar in db.Cars
where inCar.id_Base != null && inCar.IdCar == car.IdCar
select new CarDTO
{
Name = inCar.Name,
IdCar = inCar.IdCar,
IdBase = inCar.id_Base,
InnerCar = null
}
).FirstOrDefault(x => x.IdBase == car.id_Base)
select new CarDTO
{
Name = car.Name,
IdCar = car.IdCar,
IdBase = car.id_Base,
InnerCar = innerCar
};
但InnerCar 始终为空。我无法理解我做错了什么。有谁知道如何投影每个元素并创建InnerCar?
【问题讨论】:
-
innerCar(小写的l)永远不为空吗?.FirstOrDefault(x => x.IdBase == car.id_Base)是否返回非空值?如果子查询总是返回 null,请找出原因。 -
本田是沃尔沃的品牌吗?
-
我建议提取所有数据,然后使用递归算法在内存中创建关系,因为您真正拥有的是表中的树结构。
-
@StepUp All you need to do is search.
-
我已经撤回了我的回答,因为您现在已经使用正确的标签编辑了问题。我仍然认为您应该使用
Join,但我没有时间设置环境来演示如何。 EF 连接的文档应该足够好,以便您了解如何使其适应您的情况。
标签: c# entity-framework linq linq-to-entities