我有以下通用方法,我需要能够执行LINQ Where查询:
public static List<T> GetItems<T>(Guid parentId = new Guid()) where T : new()
{
var db = new SQLiteConnection(_dbPath);
List<T> result;
if (parentId != Guid.Empty)
{
result = db.Table<T>().Where(i => i.ParentId.Equals(parentId)).ToList();
}
else
{
result = db.Table<T>().ToList();
}
db.Close();
return result;
}
Run Code Online (Sandbox Code Playgroud)
编译器不喜欢以下行
result = db.Table<T>().Where(i => i.ParentId.Equals(parentId)).ToList();
Run Code Online (Sandbox Code Playgroud)
错误:无法解析'ParentId'
是否可以在LINQ查询中以这种方式使用泛型?请注意,类型T的对象将始终具有ParentId属性.
您应该T使用一些包含所需值的接口来固定参数.此外,您应该将此接口添加到包含此类的字段或基类型的所有类型.
public interface IHierarchy
{
public Guid ParentId { get; }
}
public static List<T> GetItems<T>(Guid parentId = new Guid())
where T : IHierarchy, new()
{
var db = new SQLiteConnection(_dbPath);
List<T> result;
if (parentId != Guid.Empty)
{
result = db.Table<T>().Where(i => i.ParentId.Equals(parentId)).ToList();
}
else
{
result = db.Table<T>().ToList();
}
db.Close();
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果您有两种类型的实体,第一种包含所需的值而第二种不包含,则可以为此方案设置两次重载.
您使用了泛型类型,而编译器不知道entity您将使用哪个类型。
只要利用语言reflection的特点就可以了.NET。
result = db.Table<T>().Where(i => i.GetType().GetProperty("ParentId").GetValue(src, null).Equals(parentId)).ToList();
Run Code Online (Sandbox Code Playgroud)