【问题标题】:Is there a way to select a columns from a joined table without explicitly listing all columns?有没有一种方法可以在不明确列出所有列的情况下从连接表中选择列?
【发布时间】:2014-06-05 13:37:48
【问题描述】:

我正在尝试使用 JoinSqlBuilder 从其中一个联接表中选择数据,但除非我列出该表中的所有列,否则我找不到这样做的方法。希望我遗漏了一些东西,它实际上可以完成。

这大概是我所拥有的:

var sql = new JoinSqlBuilder<Product, Product>()
.Join<Product, Customer>(src => src.Id, dst => dst.Id)
.Where<Customer>(x => x.Id == Id);

我想从产品表中选择所有内容。上面的查询抛出了一个抱怨列名冲突的异常,所以它显然是从两个表中选择的。

编辑:最后我想要这个sql(别管设计,它不是真的):

   select 
        p.* //<-- This is the piece that I'm struggling with
   from product p inner join customer c on p.id on c.productId
   where blah;

看起来 OrmLite 希望我明确列出我想要返回的所有列,我想避免这样做。

【问题讨论】:

    标签: ormlite-servicestack


    【解决方案1】:

    注意:我使用的是 3.9.71 的 servicestack。我还没有看过 4.0 的实现。

    我认为您的加入存在 FK 关系问题。假设产品有一个名为 (CustID) 的客户 FK,它看起来像这样。此外,如果您要返回结果的“组合”,则需要一个 POCO 来表示结果集。我认为您不会想要返回两个“ID”列,而是返回一个 FK 列。

    return _factory.Run<ProductCustomer>(conn=>
    {
        var jn = new JoinSqlBuilder<Product, Customer>();
    
        jn = jn.Join<Product, Customer>(srcProd => srcProd.CustId, 
            dstCust => dstCust.Id, // set up join Customer.id -> Product.CustId
            p => new { p.Id, p.OtherField}, // product table fields returned
            c => new { c.Name, c.AddressId}, // customer fields returned
            null, //where clause on the product table
            cust=>cust.Id = customerId // where clause on the customer table
        );
    
        var sql = jn.ToSQL();
    
        return conn.FirstOrDefault<ProductCustomer>(sql);
    }
    

    希望这会有所帮助。

    编辑:编辑后,试试这个:

        // set up join Customer.id -> c.ProductId
        jn = jn.Join<Product, Customer>(srcProd => srcProd.Id, dstCust => dstCust.productId)
            .Where<Customer>(c=>c.Id == custIdParameter);
        var sql = jn.ToSql();
    

    您可以再次为

    添加一个“.Where”
    Where<Product>(p=>p.id == foo);
    

    如果您需要使用 BLAH 添加更多产品。这应该会让你接近。

    【讨论】:

    • 嗯,不,不涉及外键。你有 p => new { p.Id, p.OtherField},我想避免,因为表很大。我将编辑问题以显示我想要的结果 sql。
    • 添加了一个编辑。希望这可以帮助。由于您的“blah”仍然未知,因此您可以根据需要添加更多 .Where
    【解决方案2】:

    您尝试过 SelectAll 扩展方法吗?

    var sql = new JoinSqlBuilder<Product, Product>()
    .Join<Product, Customer>(src => src.Id, dst => dst.Id)
    .SelectAll<Product>()
    .Where<Customer>(x => x.Id == Id);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 2018-12-10
      • 2014-12-26
      • 2019-05-23
      相关资源
      最近更新 更多