LINQ如何使用泛型类型?

lep*_*ton 5 c# linq

我有以下通用方法,我需要能够执行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属性.

Vad*_*nov 7

您应该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)

如果您有两种类型的实体,第一种包含所需的值而第二种不包含,则可以为此方案设置两次重载.

  • 不确定那里的`new()`约束是什么 (3认同)

Mih*_*nut 6

您使用了泛型类型,而编译器不知道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)