我正在一个Xamarin iOS项目中使用SQLite.NET Async(http://www.nuget.org/packages/SQLite.Net.Async-PCL/),但是在使用表谓词查询时遇到了问题。
每当我使用下面的Get方法(非常简单)时,我都会收到一个异常,指出表达式无法编译,System.NotSupportedException:无法编译:Parameter。
但是,如果我使用低级别查询,如GetQuery方法,它就可以正常工作。是否在定义我的表或该方法中做错了什么,导致sqlite.net无法编译表达式?
编辑#1: 问题似乎与我的方法是通用的有关。如果我将它们更改为特定于模型“connection.Table<EventDataModel>.Where(...”的方法,则可以工作。通用方法不起作用吗?
编辑#2: 我添加了一个“类”约束到T上,与现有的“IDataModel,new()”约束一起使用,这似乎已解决了该问题...这有意义吗?
每当我使用下面的Get方法(非常简单)时,我都会收到一个异常,指出表达式无法编译,System.NotSupportedException:无法编译:Parameter。
但是,如果我使用低级别查询,如GetQuery方法,它就可以正常工作。是否在定义我的表或该方法中做错了什么,导致sqlite.net无法编译表达式?
public interface IDataModel
{
[PrimaryKey, AutoIncrement]
int Id { get; set; }
}
public class BaseDataModel : IDataModel
{
[PrimaryKey]
public virtual int Id { get; set; }
}
[Table("Event")]
public class EventDataModel : BaseDataModel
{
public string Name { get; set; }
public int OrganizationId { get; set; }
public DateTime StartDate { get; set; }
public DateTime? EndDate { get; set; }
public bool Active { get; set; }
}
public class DataService<T> : IDataService<T> where T : IDataModel, new()
{
public virtual async Task<T> Get(int id)
{
var connection = await GetConnection();
return await connection.Table<T>()
.Where(item => item.Id == id)
.FirstOrDefaultAsync();
}
public virtual async Task<T> GetQuery(int id)
{
var connection = await GetConnection();
return (await connection.QueryAsync<T>("SELECT * FROM Event WHERE Id = ?", id))
.FirstOrDefault();
}
}
编辑#1: 问题似乎与我的方法是通用的有关。如果我将它们更改为特定于模型“connection.Table<EventDataModel>.Where(...”的方法,则可以工作。通用方法不起作用吗?
编辑#2: 我添加了一个“类”约束到T上,与现有的“IDataModel,new()”约束一起使用,这似乎已解决了该问题...这有意义吗?
T
上未定义Id
。 - Jean Hominal