5

我正在为我的 MVC2 应用程序使用 Linq-SQL 实体。

我有那些表/实体

人(ID、姓名、姓氏)汽车(ID、型号、姓名)经销商(ID、姓名)

我有那些 2 多对多表

Persons_Cars (ID, ID_Person, ID_CAR) Persons_Resellers (ID, ID_Person, ID_Reseller)

 public MyModel {

   //Some Fields

    public List<CarPerson> carList;

    public CarPerson 
    {
      String detail;
      int id;
    }
}
 var query=(from person in data.Person

                     join PerCar in data.Persons_Cars on person.ID equals Persons_Cars.ID_Person into JoinedPerCar
                     from PerCar in JoinedPerCar.DefaultIfEmpty()

                     join car in data.car on PerCar .id_car equals car.ID into JoinedCarPe
rson
                     from car in JoinedCarPerson.DefaultIfEmpty()

                     join PerReseller in data.Persons_Resellers on person.ID equals  PerReseller .id_person into JoinedPersReseller 
                     from PerReseller in JoinedPersReseller.DefaultIfEmpty()

                     join Reseller in data.Reseller on PerReseller.id_reseller equals Reseller.ID into JoinedResellerPers
                     from Resller in JoinedFormazioneComp.DefaultIfEmpty()

                     where person.ID_USER == USER.ID 
                     select new MyModel
                                { 
                                     carList = JoinedPerCar.Select(m=>new CarPerson {detail=m.car.Model,id = m.ID}).ToList()},
                                //Other
                                });

我知道这是完全错误的,但我是 Linq-SQL 的新手,我现在有一个问题:

查询有效,但我的结果是错误的。事实上,如果一个人有 2 辆汽车,我会用 2 辆汽车清单两次接收同一个人。

例子

布朗先生有 2 辆车我收到了布朗先生 ---> 汽车列表(Car1,Car2)布朗先生 ---> 汽车列表(Car1,Car2)

所以我需要,如果一个人有 2 辆车,我只得到 1 个有自己车的人的结果

有没有办法更好地编写这个查询?如何解决我的问题?

谢谢

4

2 回答 2

10

我认为简单的子查询可以完成这项工作(对于经销商也是如此):

from p in data.Person
select new MyModel {
  carList = (from pc in data.Persons_Cars
             join c in data.car on pc.id_car equals c.ID
             where pc.ID_Person == p.ID 
             select c).ToList()
};

如果您定义了导航属性,那么查询将更加简单(Linq 将为您执行连接):

from p in data.Person
select new MyModel {
   carList = p.Person_Cars.Select(pc => pc.Car).ToList()
};
于 2013-04-03T11:20:59.320 回答
3

使用 Person 和 Car 以及数据库关系的正确属性,这可以在上下文的 OnModelCreating 方法中设置,因此您不需要在上下文中使用 Person_Cars 模型:

modelBuilder.Entity<Car>()
                .HasMany(x => x.People)
                .WithMany(y => y.Cars)
                .Map(z =>
                {
                    z.MapLeftKey("CarID");
                    z.MapRightKey("PersonID");
                    z.ToTable("Person_Cars");
                });

然后你应该能够通过以下方式获得你的人的汽车:

from p in context.People
where p.PersonID = pID
select p.Cars

或者返回 Person 及其填充的 Car 列表:

context.People.Where(p => p.PersonID == pID).Include(c => c.Cars).FirstOrDefault();
于 2016-08-09T17:57:17.480 回答