c# - 如何创建 C# 通用 Linq 查询器?

标签 c# linq entity-framework

首先考虑使用 Entity Framework 代码构建的具有多个表的数据库。每个表都包含不同类型的对象,但出于可扩展性的考虑,我希望创建一个通用查询构建器类。就此类的框架而言,我有一个通用类,旨在充当 Linq to SQL 的包装器:

public class DBQuerier<T>
    where T : class
{
    DbSet<T> relation;

    public DBQuerier(DbSet<T> table)
    {
        relation = table;
    }

    public bool Exists(T toCheck);
    public void Add(T toAdd);
    public T (Get Dictionary<String, Object> fields);
    public bool SubmitChanges();
    public void Update(T toUpdate, Dictionary<String, Object> fields);
    public void Delete(T toDelete);
}

我的问题是在尝试检查记录是否存在时遇到的第一个障碍,因为我无法在通用类型 T 和我尝试使用的对象类型之间进行转换。如果我使用基本 Linq:

public bool Exists(T toCheck)
{
    return (from row in relation
        where row.Equals(toCheck)
        select row).Any();
}

即使我实现了 IComparable 并指定了我自己的 Equals 来比较单个字段,但 SQL 无法处理原始类型,因此发生了运行时异常。 Lambda 表达式似乎更接近,但后来我再次遇到问题,SQL 无法处理比原始类型更多的问题,尽管我的理解是 Expression.Equal 强制它使用类的可比较函数:

public bool Exists(T toCheck)
{
    ParameterExpression T1 = Expression.Parameter(typeof(myType), "T1");
    ParameterExpression T2 = Expression.Parameter(typeof(myType), "T2");
    BinaryExpression compare = Expression.Equal(T1, T2);
    Func<T, T, bool> checker =
        Expression.Lambda<Func<T, T, bool>>
            (compare, new ParameterExpression[] { T1, T2 }).Compile();
    return relation.Where(r => checker.Invoke(r, toCheck)).Any();
}

表达式树的设计初衷是为了稍后我可以添加一个 switch 语句来根据我试图查看的类型构建查询。 我的问题是:是否有更简单/更好的方法来执行此操作(或修复我到目前为止尝试过的方法),因为我能看到的唯一其他选项是为每个表编写一个类(不那么容易扩展)或检查每个记录应用程序端(如果您必须传输整个数据库,速度可能会非常慢!)?如果我犯了如此非常基本的错误,我深表歉意,因为我已经很久没有使用过很多这样的东西了,在此先感谢!

最佳答案

不要编译它。 Func<T,bool> Expression<Func<T,bool>> 表示“在内存中运行”意思是“保持这个谓词是什么的逻辑思想”,它允许像 Entity Framework 这样的框架将其翻译成查询。

附带说明一下,我不认为 Entity Framework 可以让你做 a.Equals(b)查询,所以你必须做 a.Id == b.Id

关于c# - 如何创建 C# 通用 Linq 查询器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18063309/

相关文章:

c# - .net Core 2.0 的 NLog 数据库目标

c# - 如何将 LINQ 查询中的 "var"填充到同一个数据表中?

c# - 使用 Code First 对 3 个表之间的多对多关系建模

c# - 异步不适用于 EF + 工作单元 + Repo

c# - ASP.net 核心命名空间不同步

c# - 从自定义对话框中获取 DialogResult

c# - 如何将多个对象值相互比较?

c# - 当实例在多列上分组或分类时如何找到平均值?

c# - 无法设置数据库初始值设定项 Entity Framework

asp.net-mvc - Entity Framework "Migrations Configuration"和 autofac