首先考虑使用实体框架代码构建的具有多个表的数据库。每个表都包含不同类型的对象,但为了可扩展性,我希望创建一个通用查询构建器类。就这个类的框架而言,我有一个泛型类,旨在充当 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 语句来根据我试图查看的类型构建查询。我的问题是:有没有更简单/更好的方法来做到这一点(或修复我迄今为止尝试过的),因为我能看到的唯一其他选择是为每个表编写一个类(不那么容易扩展)或检查每个记录应用程序端(如果您必须传输整个数据库,可能会非常慢!)?如果我犯了非常基本的错误,我深表歉意,因为我已经很长时间没有处理这些问题了,在此先感谢!