How to use LINQ Where for generic type?

You should concretize T parameter with some interface which will include required values. Also, you should add this interface to all types that contains this field or base type for its classes.

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;
}

If you have 2 types of entities and the first contains required values and the second does not, then you can have two overloads for this scenario.


You used a generic type and the compiler don't know which entity are you going to use.

Just use reflection feature of .NET language.

result = db.Table<T>().Where(i => i.GetType().GetProperty("ParentId").GetValue(src, null).Equals(parentId)).ToList();

Tags:

C#

Linq