我创建了a repository with a complete example of what I'm trying to do。
我有以下架构:
class Order
{
public int OrderId { get; set; }
}
class LineItem
{
public int LineItemId { get; set; }
public int OrderId { get; set; }
}
我使用ServiceStack.OrmLite使用此代码将Order与LineItem连接起来:
var query = db.From<Order>()
.LeftJoin<LineItem>()
.Where(o => o.OrderId == 1);
var results = db.SelectMulti<Order, LineItem>(query);
SelectMulti()
返回List<Tuple<Order, LineItem>>
。如果订单中没有订单项,我将返回new LineItem()
而不是null
。
我希望得到null
,所以我可以分辨出#34;这个订单没有订单项&#34;和&#34;此订单的订单项为默认值&#34;。
我可以检查订单项OrderId
是否等于订单OrderId
,但理论上我可以订购OrderId
0,所以在这种情况下,我无法告诉你。
有没有更好的方法与OrmLite进行左联接?
答案 0 :(得分:0)
我使用的快速而肮脏的解决方案是检查返回的相关对象是否为“空”。
我使用一个小的内联函数做到了这一点,
bool IsEmptyObject<T>(T instance)
{
var empty = Activator.CreateInstance(instance.GetType());
return empty.ToJson() == instance.ToJson();
}
答案 1 :(得分:0)
我希望返回空值,所以我可以分辨出“此订单不存在任何订单项”和“此订单的订单项具有默认值”之间的区别。
LEFT JOIN的问题是该行确实存在,但是所有字段都以null
的形式返回,而OrmLite映射到一个实例,该实例中没有初始化的字段与不存在的行没有区别。 >
我可以检查订单项的OrderId是否等于订单的OrderId,但从理论上讲,我可以拥有OrderId为0的订单,因此在这种情况下我将无法分辨。
这应该是不可能的,因为自动递增主键从1(默认)开始并向上递增。如果您有一个带有int
的{{1}}主键,则应将其视为无效状态(这可能是它添加不正确的指示),因此对0
进行检查就足够了。