代码之家  ›  专栏  ›  技术社区  ›  Guerrilla

使用表别名和类型化查询选择多个

  •  0
  • Guerrilla  · 技术社区  · 3 年前

    我需要连接同一个表两次,所以在文档中看到我可以使用表别名,但我在选择连接的表时遇到了一些困难。。

    这是我尝试过的:

    var q = _AutoQuery.CreateDevXQuery(request, base.Request.GetRequestParams(), base.Request);
    q.LeftJoin<WritingAssignment, Blog>((w, b) => w.WriterSuggestBlog == b.Id, Db.TableAlias("b1"));
    q.LeftJoin<WritingAssignment, Blog>((w, b) => w.ApprovedBlog == b.Id, Db.TableAlias("b2"));
    
    q.Select<WritingAssignment, WriterProfile, Blog>((wa, wp, b) => new
    {
        WritingAssignment = wa,
        WriterProfile = wp,
        SuggestedBlog = Sql.TableAlias(b, "b1"),
        AcceptedBlog = Sql.TableAlias(b, "b2")
    });
    
    var values = Db.Select<Tuple<WritingAssignment, WriterProfile, Blog, Blog>>(q);
    

    这个 WritingAssignment WriterProfile 很好,但这两个博客值只是通过了默认的属性值。文档仅显示了它使用单列的示例。使用表别名引用整个表的方法是什么?

    我用这个选择得到了它:

    q.Select("writing_assignment.*, 0 EOT, writer_profile.*, 0 EOT, b1.*, 0 EOT, b2.*");
    

    但我觉得我应该能够让它发挥作用 Sql.TableAlias 。有可能吗?

    0 回复  |  直到 3 年前
        1
  •  2
  •   mythz    3 年前

    我刚刚在中添加了对该语法的支持 this commit 其中您的初始语法应按预期工作:

    q.Select<WritingAssignment, WriterProfile, Blog>((wa, wp, b) => new
    {
        WritingAssignment = wa,
        WriterProfile = wp,
        SuggestedBlog = Sql.TableAlias(b, "b1"),
        AcceptedBlog = Sql.TableAlias(b, "b2")
    });
    
    var values = Db.Select<Tuple<WritingAssignment, WriterProfile, Blog, Blog>>(q);
    

    默认情况下,如果没有 EOT 如果设置了分隔符,则在元组中选择多个表将根据模型字段计数进行拆分,但只要所选字段列表与模型定义不匹配,就可以使用插入显式表分隔符 Sql.EOT ,例如:

    q.Select<WritingAssignment, WriterProfile, Blog>((wa, wp, b) => new
    {
        Id = wa.Id,
        Name = wa.Name,
        t1 = Sql.EOT,
        WriterProfile = wp,
        t2 = Sql.EOT,
        SuggestedBlog = Sql.TableAlias(b, "b1"),
        t3 = Sql.EOT,
        AcceptedBlog = Sql.TableAlias(b, "b2")
    });
    
    var values = Db.Select<Tuple<WritingAssignment, WriterProfile, Blog, Blog>>(q);
    

    此更改可从v5.11.1开始使用,即现在 available on MyGet .