SQLite通用存储库 - 如果T是typeof(MyObject)

时间:2017-04-05 20:31:13

标签: c# generics xamarin sqlite

我使用Visual Studio,C#和SQLite作为Xamarin应用程序,一切运行良好。但是,我正在使用我希望扩展的通用存储库,以便能够添加到GET以针对2个属性添加检查如果通用属于特定类型

Here is the Generic respository pattern I am following

我现在设置的GET看起来像这样:

public List<T> Get<TValue>(Expression<Func<T, bool>> predicate = null, Expression<Func<T, TValue>> orderBy = null)
{
    var query = db.Table<T>();

    if (predicate != null)
        query = query.Where(predicate);

    if (orderBy != null)
        query = query.OrderBy<TValue>(orderBy);

    return new List<T>(query);
}

但是我想添加这样的东西(伪代码):

RecordOwner是Type,RecordOwnerCompanyId和RecordOwnerUserId是我想要添加到predicate / where子句的属性。 请记住,hte lambda不起作用,这适用于SQLite(查询类型为TableQuery<T>

public List<T> Get<TValue>(Expression<Func<T, bool>> predicate = null, Expression<Func<T, TValue>> orderBy = null)
{
    var query = db.Table<T>();

    if (predicate != null)
        query = query.Where(predicate);

    if (orderBy != null)
        query = query.OrderBy<TValue>(orderBy);

    // Perform record owner checks
    if (typeof(RecordOwner).IsAssignableFrom(typeof(T)))
    {
        query = query.Where(x => RecordOwnerCompanyId == 1234 && x.RecordOwnerUserId == 1234);
    }

    return new List<T>(query);
}

非常感谢任何帮助。

更新

我确实有一个可以获得我想要的工作解决方案但是我更倾向于使用谓词解决这个问题,因为下面显示的方式是使用更多内存和2个列表。它并没有对性能产生负面影响,但并不是我想要的理想解决方案。如果有人知道如何使用可能很棒的谓词来完成这一切。

新的工作示例(不使用谓词):

public List<T> Get<TValue>(Expression<Func<T, bool>> predicate = null, Expression<Func<T, TValue>> orderBy = null)
{
    var query = db.Table<T>();

    if (predicate != null)
        query = query.Where(predicate);

    if (orderBy != null)
        query = query.OrderBy<TValue>(orderBy);

    var memUser = JstMem.Default.User;

    // Perform record owner checks
    if (typeof(RecordOwner).IsAssignableFrom(typeof(T)))
    {
        return new List<T>(query).Where(x => (x as RecordOwner).RecordOwnerCompanyId == memUser.SelectedCompanyId && (x as RecordOwner).RecordOwnerUserId == memUser.UserId).ToList();
    }

    return new List<T>(query);
}

0 个答案:

没有答案