有没有办法从连接表中选择列而不显式列出所有列?

时间:2014-02-24 16:31:31

标签: ormlite-servicestack

我正在尝试使用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希望我明确列出我想要返回的所有列,我想避免这些。

2 个答案:

答案 0 :(得分:2)

注意:我正在使用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添加更多产品。这应该会让你接近。

答案 1 :(得分:1)

您是否尝试过SelectAll扩展方法?

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