使用反射和通用类型从数据库中获取记录



我想从db检索一个实例。我已经使用EF创建了DB模型。我可以以静态方式做到这一点:

var tempRecord= db.Table1.First(a => a.column1 ==  columnValue);

但是,如果当前表的类更改,有时是table1,有时是table2,该怎么办?我尝试了这样的事情,但显然它不起作用:

Type entityType = Type.GetType(currentTable);
var tempRecord2 = db.entityType.First(a => a.column1 == columnValue);

编辑:CurrentTable是字符串

有5个表,每个表需要检查不同的列。因此,我将有要检查每个表的列列表

我建议我看看这个答案,应该激发您的灵感。

在其中,代码依赖于通用函数,传递linq Func<>来委派First()(或在他的情况下,SingleOrDefault()),因此它可以为发送到方法的任何对象集(或表)执行相同的方法,就像下面一样:

 public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T:class {
        return GetObjectSet<T>().SingleOrDefault(expression);
    }

到目前为止一切都很好。但是这样,您的列必须全部命名为column1。但是建议是检索主要键,这在链接的答案中也进一步解释。

这可能会有所帮助:

    Type entityType = Type.GetType("MyNameSpace.Models.City");
    var result = ((IQueryable<object>)db.Set(entityType)).FirstOrDefault();

除了列检查。
添加列检查的一种可能解决方案是使用包含参与所有表过滤的所有字段的父类,并将第二行更改为此:

var result = ((IQueryable<ParentClass>)db.Set(entity)).First(a => a.column1 == columnValue);

假设" column1"是一个普通属性,您可以使用此方法:

        Type type = Type.GetType(currentTable);
        IEnumerable a = db.Database.SqlQuery(type, "SELECT * FROM " + name + " WHERE column1 = " + "x");

然后,根据数据库修改查询并获取第一行,或在运行时施放并使用first()。

如果您的情况是您仅具有五个具有同一列的表,则需要查询这些列的每个表的数据库,然后之后不同列的结果进行检查,然后我想我会选择一个吻解决方案而不是使用反射。

给定此示例表:

Table1
    ColumnA, Table1ColumnB, Table1ColumnC
Table2
    ColumnA, Table2ColumnB, Table2ColumnC
Table3
    ColumnA, Table3ColumnB, Table3ColumnC

,如果没有更多的表格,我会这样询问它们:

using(var ctx = new MyDbContext())
{
    Table1 tbl1 = ctx.Table1s.FirstOrDefault(x => x.ColumnA == "myvalue");
    Table2 tbl2 = ctx.Table2s.FirstOrDefault(x => x.ColumnA == "myvalue");
    Table3 tbl3 = ctx.Table3s.FirstOrDefault(x => x.ColumnA == "myvalue");
    // Perform null checks and other checks against different columns here
} 

简而言之:不要过度思考: - )

最新更新