【问题标题】:How can I use a Func<T, bool> as a parameter in a method that queries data from a SQLite database? [duplicate]如何在从 SQLite 数据库查询数据的方法中使用 Func<T, bool> 作为参数? [复制]
【发布时间】:2020-08-26 21:02:13
【问题描述】:

我有这个代码:

var ListToBeDeleted = db2.Table<Deck>().Where(x => x.Id == App.DeckId).ToList();

我想做的是创建一个通用函数,可用于这种情况和其他使用 Func 的情况。我已经有了这个,但我不确定如何修改它。

    public List<T> RunQuery<T>(??) where T : new()
    {
        List<T> data = db2.Query<T>(s);
        return data;
    }

所以我可以这样称呼它:

var ListToBeDeleted = db2.QueryWithWhere<Card>( <where clause here> );

有没有人可以给我一些建议,告诉我如何将这样的 where 子句添加到泛型中?

【问题讨论】:

  • 请阅读How to Ask 并展示您的尝试。您是否考虑过检查db2.Query&lt;T&gt;(s) 方法签名并查看s 参数的类型?

标签: c# entity-framework sqlite


【解决方案1】:

Where 方法采用Expression 参数,因此您将传递Expression&lt;Func&lt;T, bool&gt;&gt;

public List<T> RunQuery<T>(Expression<Func<T, bool>> filter) where T : new()
{
    var data = db2.Table<T>().Where(filter).ToList();
    return data;
}

// To use it
var ListToBeDeleted = db2.RunQuery<Card>(c => c.Id == App.DeckId);

【讨论】:

    【解决方案2】:

    您可以使用反射从实体中获取属性并编写类似这样的内容,

    解决方案 1

    
    string property = "Id";
    var ListToBeDeleted = db.Query<Card>(i=>i.GetType().GetProperty(property).GetValue(val,null).Equals(id)).ToList();
    
    

    【讨论】:

    • 你为什么要把它标记为负面。这也正确、彻底地解决了问题。可以使用反射,也可以使用正则表达式解析 where 子句并动态传递以运行查询。
    • @Alan2 希望能够动态地将表达式传递给Where 方法,这很容易通过传递Expression&lt;Func&lt;T, bool&gt;&gt; 来完成。反射可能很昂贵,如果它像实体框架,则会引发异常,因为 db 提供程序不知道如何将反射方法转换为 SQL。
    • 我投了反对票,因为这根本不能回答问题,而且如果回答了,这在实体框架中将不起作用,它不会将反射转换为 SQL。
    • 它与实体框架无关,它仅与 sql 查询有关,先生,请删除您的反对票,我通过在 StackOverflow 中搜索为用户找到了这个答案,这个问题本身可能是重复的。
    • 这个问题肯定与实体框架有关,看看标签。再说一次,即使你的答案会奏效,这也不是 OP 所要求的。
    猜你喜欢
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多