问题描述
我正在尝试对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>();