我们有一个使用 EntityFramework 无法使用的旧数据库的项目。
所以我们开始构建一个带有基类的穷人EntityFrameworkCustomBaseTable
实体类从中派生。又一堂课,CustomQueryBuilder
,具有构建 SQL 查询的方法:BuildSelectQuery(CustomBaseTable p_objEntity)
等等。
我们的第一个版本很好地构建了查询,但是我们使用了相当粗糙的对象,这些对象并不真正灵活(为了节省空间而保留了详细信息)。
我最近意识到使用Expression
对象将更加高效和灵活。
所以我想添加一个方法CustomBaseTable
,这或多或少会像Where()
:
EntityTable z_objEntity = new EntityTable();
z_objEntity.CustomWhere(t => t.Field1 == Value1);
CustomQueryBuilder z_objBuilder = new CustomQueryBuilder(DBTypeEnum.DataBaseType);
string z_strQuery = z_objBuilder.BuildSelectQuery(z_objEntity);
现在,我在宣布时遇到了障碍CustomWhere()
。我尝试了几种方法:
public class CustomBaseTable
{
public void CustomWhere1<T>(Expression<Func<T, bool>> p_expWhereClause) where T : CustomBaseTable
public void CustomWhere2<T>(this T z_objTable, Expression<Func<T, bool>> p_expWhereClause) where T : CustomBaseTable
}
public static class CustomBaseTableExtension
{
public static void CustomWhere3<T>(this T z_objTable, Expression<Func<T, bool>> p_expWhereClause) where T : CustomBaseTable
}
然而,就我而言,每个人都有一个缺陷:
-
CustomWhere1
需要指定<EntityTable>
每次调用它时,都会占用空间并且是多余的,因为调用该方法的对象具有相同的类型:z_objEntity.CustomWhere<EntityTable>(t => t.Field1 == Value1);
-
CustomWhere2
需要传递它所调用的对象,也会占用空间并且也是多余的:z_objEntity.CustomWhere(z_objEntity, t => t.Field1 == Value1);
-
CustomWhere3
巧妙地避免了这两个缺陷,但显然需要创建一个单独的扩展类。如果需要的话我会接受,但我不明白为什么需要它。
有没有一种方法可以在不创建扩展类的情况下使用简单的调用语法?