如何使用属性作为列表从表中连接两个表

时间:2017-08-24 14:42:25

标签: c# linq join

我有两个表及其各自的POCO类:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<int> CarIds { get; set; }
}

public class Car
{
    public int Id { get; set; }
    public string Brand { get; set; }
    public string Model { get; set; }
    public int Year { get; set;}
}

我有一个DTO作为

public class PersonDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Car> Cars { get; set; }
}

一个人可能有没有或很多汽车。

如何编写LinQ查询以从PersonDTO(人员)和List<Person>(汽车)创建List<Car>

我已经开始了

var q = (from p in Persons
         from c in Cars.Where(x => p.CarIds.Contains(x.Id))
         select new PersonDTO
         {
             Id = p.Id,
             Name = p.Name,
             Cars = c
         }).ToList();

但是我收到以下错误:

  

表达式树可能不包含使用的调用或调用   可选参数。

我该如何撰写此查询?

我认为提供有关此问题的进一步信息是非常必要的,因为我可能会误导其他成员。

实际上我使用MongoDB作为数据源,我的实际代码如下:

IMongoCollection<Person> persons = db.GetCollection<Person>("person");
IMongoCollection<Car> cars = db.GetCollection<Car>("car");

var model = (from p in persons.AsQueryable<Person>()
             from c in cars.AsQueryable<Car>().Where(x => p.CarIds.Contains(x.Id))
             select new PersonDTO
             {
                 Id = p.Id,
                 Name = p.Name,
                 Cars = c
             }).ToList();

我也试过

var model = (from p in persons.AsQueryable<Person>()
             select new PersonDTO
             {
                 Id = p.Id,
                 Name = p.Name,
                 Cars = cars.AsQueryable<Person>().Where(x => b.CarIds.Contains(x.Id))
             }).ToList();

但我仍然得到同样的错误。

关于我不使用RDBMS汽车的关系,并不仅仅属于一个人,因为它在日常生活中。汽车就像一个标签。我认为将其视为StackOverfow中的标签会更好。每个标记都是唯一的,每个标记都有零个,一个或多个标记,许多帖子可能在您的帖子中具有相同的标记。当我显示我的帖子时,我得到了我输入的标签。我想要的是这种关系。

我希望这更有意义。

1 个答案:

答案 0 :(得分:0)

更新 我在Linqpad尝试了这个,这是有效的。

void Main()
{
    var Persons = new List<Person>() { new Person { CarIds = new List<int> { 1, 2, 3 } }, new Person { CarIds = new List<int> { 4, 5 } } };
    var Cars = new List<Car>() { new Car { Id = 1 }, new Car { Id = 2 }, new Car { Id = 3 }, new Car { Id = 4 }, new Car { Id = 5 } };

    (from p in Persons
     select new PersonDTO
     {
         Id = p.Id,
         Name = p.Name,
         Cars = Cars.Where(x => p.CarIds.Contains(x.Id)).ToList()
     }).ToList().Dump();
}

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<int> CarIds { get; set; }
}

public class Car
{
    public int Id { get; set; }
    public string Brand { get; set; }
    public string Model { get; set; }
    public int Year { get; set; }
}
public class PersonDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Car> Cars { get; set; }
}

您的数据来源是什么?数据库?