【发布时间】:2014-02-22 22:17:25
【问题描述】:
我在 Xamarin iOS 项目中使用 SQLite.NET Async (http://www.nuget.org/packages/SQLite.Net.Async-PCL/),但在使用表谓词查询时遇到问题。
每当我使用下面的Get方法时,很简单,我收到一个表达式无法编译的异常,System.NotSupportedException:无法编译:参数。
但是,如果我使用低级别查询,例如 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
编辑#2: 我在 T 上添加了一个“类”约束,以配合现有的“IDataModel,new()”约束,这似乎解决了问题......这有意义吗?
【问题讨论】:
-
必须缺少某些东西 - 由于
Id未在类型T上定义,当前代码无法编译。 -
是的,我省略了一些代码,因为实际代码要复杂得多。我已经更新了。
-
是的,约束非常有意义。您可以通过使用不包含 Id 字段的类运行 GetQuery 函数来尝试此操作。基于 LINQ 的函数是强类型的,而查询不是(where 子句部分)。在桌面/服务器应用程序上,您可以使用动态参数而不是通用参数,但就像查询一样,您可能会遇到运行时异常。
-
关于查询的另一件事是,如果你想让它通用,你不能使用硬编码的“FROM Event”,你必须用 TableAttribute 的值替换它([Table (“事件”)])。
-
“添加类约束”是什么意思?
标签: c# xamarin.ios xamarin .net-4.5 sqlite.net