如何连接table1 - table2和table1 - table3并返回DTO变量

时间:2016-10-07 12:04:33

标签: c# linq asp.net-web-api

在我的Web API项目中,我有这个查询连接2个表(Table1和Table2)并返回一个DTO变量:

int my_id=1;
var sample = db.Table1.Where(s1 => s1.Id == my_id)
                      .Join(db.Table2, s1 => s1.Id, s2 => s2.id_s1,
                       (s1, s2) => new sampleDTO()
                       {
                             User_Id = s1.User.Id,
                             ProdId = s2.ProdId
                       }));

现在我想加入Table3,它连接Table1并将参数添加到现有的" sample"变量

我尝试在上面的代码之后添加一个Join子句但是没有用,所以我尝试用Table1和Table3创建一个带有Join子句的新DTO变量,然后合并2个变量但不是&#39工作。

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:2)

使用方法语法,您必须投射一个新对象。但是,如果切换到查询语法:

var result = from s1 in db.Table1
             where s1.Id == my_id
             join s2 in db.Table2 on s1.Id equals s2.id_s1
             join s3 in db.Table3 on s2.SomeProperty equals s3.SomeProperty
             select new sampleDTO
             {
                  User_Id = s1.User.Id,
                  ProdId = s2.ProdId,
                  //PropertyFromTable3 = s3.SomePropertyFromTable3
             };

如果您正在使用某些ORM(如实体框架),请查看 navigation properties - 将节省所有连接的麻烦

答案 1 :(得分:0)

尝试这样的事情:

int my_id=1;

var sample = (from s1 in db.Table1
            join s2 in db.Table2
            on s1.id equals(s2.id)
            join s3 in db.Table3
            on s2.id equals(s3.id)
            .
            .
            .
            into aux from subquery in aux.DefaultIfEmpty()
            where s1.Id == my_id                      
            select new sampleDTO
            {
                User_Id = s1.User.Id,
                ProdId = s2.ProdId
            }).ToList<sampleDTO>();