Как преобразовать строку в объект сущности? - PullRequest
0 голосов
/ 25 сентября 2019

Мне нужно динамически получить значение объекта сущности из строки.как-то так:

string s = "UserMaster";
string param = "MyUser";
object o = database.s.Find(param);
//I need o to become like object o = db.UserMaster.Find(MyUser);

Извините, я не знаю названия, если уже есть функция для этого.Спасибо за ваше руководство:)

Отредактировано: Хорошо, вот большая картина:

string myString = "Hi my name is [UserMaster.Name] and my school is [SchoolMaster.SchoolName]";

Допустим, я получил строку "[UserMaster.Name]" & "[SchoolMaster.SchoolName] ", UserMaster и SchoolMaster - это имя объекта.UserMaster имеет свойство «Имя», а SchoolMaster имеет свойство «SchoolName».Мне нужно преобразовать «[UserMaster.Name]» в его значение, скажем, «MyName» и «SchoolMaster.SchoolName» в «MySchoolName».

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Вы можете использовать выражение для динамического создания кода:

static object DynamicallyGet(string name, params object[] key) {

    var entityName = Expression.Parameter(typeof(string), "entityName");
    var keyValue = Expression.Parameter(typeof(object[]), "keyValue");
    var db = Expression.Variable(typeof(RainDB), "database");
    IList<Expression> procedures = new List<Expression>();

    procedures.Add(Expression.Assign(db, Expression.New(typeof(RainDB))));

    var entityType = typeof(RainDB).GetProperty(name);
    var callMethod = Expression.Call(Expression.MakeMemberAccess(db, entityType), entityType.PropertyType.GetMethod("Find"), keyValue);

    procedures.Add(callMethod);

    var body = Expression.Block(new[] { db }, procedures);
    var lambda = Expression.Lambda<Func<string, object[], object>>(body, entityName, keyValue).Compile();

    return lambda(name , key);



//Call Function:

DynamicallyGet("UserMaster","MyUser")
0 голосов
/ 25 сентября 2019

Динамически, когда у вас есть DbSet как строка (ваш случай):

DbSet mySet = context.Set(Type.GetType("<Your Entity Name>"));

Источник: https://entityframeworkcore.com/knowledge-base/33940507/find-a-generic-dbset-in-a-dbcontext-dynamically

Помимо всего этого, динамическое построение строки с параметрами внутриобычная практика.

Обычно это достигается с помощью фигурных скобок внутри строки, например:

это в столбце базы данных: "Здравствуйте, меня зовут {User.FirstName}, я пришелfrom {User.Country} "

Обычно это предопределенные значения, и в коде вы можете заменить их, потому что ожидаете их.

Затем вы делаете:

var userId = ...get this from session or from whatever you have in your context.
var dbUser = db.User.FirstOrDefault(x => x.UserId == userId);

var template = db.Templates.FirstOrDefault(x => x.TemplateName = "userTemplate");

// template is the Db table and TemplateValue is the column
var text = template.TemplateValue;

text = text.Replace("{User.FirstName}", dbUser.Firstname);
text = text.Replace("{User.Country}", dbUser.Country);

Тоработает, но вы должны знать заранее параметры (они должны быть предварительно определены).Если вы не знаете, какой параметр должен быть отправлен (по крайней мере, отправитель должен знать, что они существуют в виде таблиц / столбцов БД), то да, это более сложно, и вам следует придерживаться предложенного нами динамического подхода.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...