与ServiceStack.OrmLite的左连接返回一个空对象而不是null

时间:2017-10-02 22:59:55

标签: c# servicestack ormlite-servicestack

我创建了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进行左联接?

2 个答案:

答案 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进行检查就足够了。