首先考虑使用 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/