我需要从字符串动态获取实体对象值。 像这样的东西:
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”。
答案 0 :(得分:0)
动态地,当您将DbSet作为字符串(您的情况)时:
DbSet mySet = context.Set(Type.GetType("<Your Entity Name>"));
除此之外,动态构建内部具有参数的字符串是常见的做法。
通常通过在字符串中使用大括号来实现,例如:
这在数据库列中: “你好,我叫{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")