如何将字符串转换为实体对象?

时间:2019-09-25 09:29:30

标签: c# entity-framework-6

我需要从字符串动态获取实体对象值。 像这样的东西:

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 :(得分:0)

动态地,当您将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},我来自{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);

可以,但是您必须事先知道参数(它们应该是预定义的)。 如果您不知道应该发送什么参数(至少发送者应该知道这些参数作为数据库表/列存在),是的,这比较棘手,您应该采用我们建议的动态方法。

祝你好运!

答案 1 :(得分:0)

您可以使用Expression动态创建代码:

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")