Получить запись из БД, используя отражение и общий тип - PullRequest
0 голосов
/ 05 марта 2019

Я хочу получить экземпляр из БД. Я создал модель БД, используя EF. Я могу сделать это статическим способом:

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 таблиц, и каждая таблица нуждается в разных столбцах для проверки. Таким образом, у меня был бы список столбцов для проверки для каждой таблицы

Ответы [ 4 ]

1 голос
/ 05 марта 2019

Предполагая, что "column1" является общим свойством, вы можете использовать этот метод:

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

Затем, в зависимости от базы данных, измените запрос и получите первую строку, или приведите во время выполнения и используйте First ().

1 голос
/ 05 марта 2019

Я предлагаю взглянуть на этот ответ, если он вас вдохновит.

В нем код опирается на общие функции, передавая LINQ Func<> для делегирования First() (или в его случае SingleOrDefault()), поэтому он может выполнять тот же метод для любого ObjectSet (или таблицы), отправляемого методу, как показано ниже:

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

Покахорошо.Но таким образом, все ваши столбцы должны быть названы column1.Но было бы предложено получить первичный ключ, что также объясняется в связанном ответе.

0 голосов
/ 05 марта 2019

Если дело в том, что у вас только есть пять таблиц с одним и тем же столбцом, и вам необходимо запросить базу данных для каждой из этих таблиц для этого столбца, а затем впоследствии выполнить проверки результат на разных столбцах, тогда я думаю, что я бы выбрал решение KISS вместо использования отражения.

Приведенные в этом примере таблицы:

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
} 

Короче: не задумывайтесь над этим: -)

0 голосов
/ 05 марта 2019

Это может помочь:

    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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...