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