从Ormlite返回自定义对象的值元组

问题描述

我正在尝试对2个表进行简单的Join,并返回这两个表的值元组

public partial class DeliveryMethod
{
    [required]
    [PrimaryKey]
    public int DeliveryMethodId { get; set; }
     [References(typeof(Event))]          
    [required]
    public string EventId { get; set; }
     [References(typeof(DeliveryType))]          
    [required]
    public short DeliveryTypeId { get; set; }
    [required]
    public int MappedValue { get; set; }
}

public partial class DeliveryType
{
    [required]
    [PrimaryKey]
    public short DeliveryTypeId { get; set; }
    [required]
    public string DeliveryTypeDescription { get; set; }
}

public List<(DeliveryMethod deliveryMethod,DeliveryType deliveryType)> GetDeliveries(string eventId)
{
    using (var db = DbFactory.OpenDbConnection(...))
    {
        var q = db.From<DeliveryMethod>()
            .Join<DeliveryType>((dm,dt) => dm.DeliveryType == dt.DeliveryType)
            .Where(dm => dm.EventId == eventId)
            .Select<DeliveryMethod,DeliveryType>((dm,dt) =>
                new {dm,dt});
        return db.Select<(DeliveryMethod deliveryMethod,DeliveryType deliveryType)>(q);
    }
}

但是,当我运行它时,我得到了NullReferenceException。这似乎是因为ConvertTovalueTuple中的OrmliteUtils仅具有用于字符串,int,DateTime等基本类型的转换器,并且GetConverter(fieldType)是自定义对象的类型时返回null。

有没有解决的办法?还是以某种方式返回更复杂的自定义对象的值元组,而不是仅返回基本元组(如int id,字符串名称,DateTime时间)?

P.S。我试图通过简化类来简化问题,所以如果我在那里犯了一个错误,我对此表示歉意,但是我认为您可以从我的问题中得到基本的思路。

解决方法

您只能通过选择列而不是整个表来使用OrmLite's C# 7 Tuple support,例如:

.Select<DeliveryMethod,DeliveryType>((dm,dt) =>
    new {dm.EventId,dt.DeliveryMethodId});
var results = db.Select<(string,int)>(q);

对于选择整个表,请检出OrmLite's SelectMulti API,例如:

var q = db.From<DeliveryMethod>()
    .Join<DeliveryType>((dm,dt) => dm.DeliveryType == dt.DeliveryType)
    .Where(dm => dm.EventId == eventId);
var results = db.SelectMulti<DeliveryMethod,DeliveryType>();