繁体   English   中英

如何使用Entity Framework确定数据库表字段并获取值

[英]How to determine database table field and get the value with Entity Framework

我正在寻找一种方法来获取具有可变事物的数据库表的字段。 我写了一个愚蠢且无法正常工作的方法来解释我的需求:

using (var dbContext = new db_ReadyEngine_MSSQL())
   {
     string nameOfField = "UserName";

     var table = dbContext.tbl_User;
     foreach (var x in table)
       {
         string fieldValue = x.nameOfField;
       }
}

在这里,我正在尝试确定nameOfField的列名称...

您可以使用列名从DataTable调用数据,例如:

Object o = dataTable.Rows[0][nameOfField];

尝试这个:

   List<string>values = new List<string>();
    using (var dbContext = new db_ReadyEngine_MSSQL())
   {

     values = (from s in dbContext.tbl_User select s.Username).ToList();

   }
   return values

假设我正确阅读了您的问题,您想获取一列的值,该列的名称仅在运行时才知道?

如果是这样,请查看下面的代码。 它将从对象类型中提取属性,搜索与nameOfField值匹配的属性,然后尝试从中提取值。

foreach (var x in table)
{
    var fieldValue = x.GetType().GetProperties().Where(a => a.Name == nameOfField).Select(p => p.GetValue(x, null)).FirstOrDefault();
}

U可以使用反射通过其字符串名称获取Property的值

using (var dbContext = new db_ReadyEngine_MSSQL())
   {
     string nameOfField = "UserName";

     var table = dbContext.tbl_User;
     foreach (var x in table)
       {
         string fieldValue = typeof(x).GetProperty(nameOfField ).GetValue(x, null) as string;
       }
}

您可以为此使用Entity SQL,而无需键入查询本身:

IEnumerable<object> GetFieldValues<T>(DbContext context, string fieldName)
    where T : class
{
    var oc = ((IObjectContextAdapter)context).ObjectContext;
    ObjectQuery<T> q = oc.CreateObjectSet<T>();
    return q.Select("it." + fieldName)
            .AsEnumerable()
            .Select(x => x[0]);
}

诀窍在于,可以轻松地将ObjectSet (其前身,sort of或DbSetDbSet转换为ObjectQuery ,后者是Entity SQL的基础。 默认情况下,命令文本使用“ it”作为查询中表的别名,因此,如果您想要一个特定字段的值,则必须在其前面加上别名作为前缀。

Select返回一个DbDataRecord 返回该记录的第一个值。

与其他方法相比,此方法的优势在于它查询数据库中的请求字段。

当然,如果您事先知道有问题的字段的类型,则可以制作此方法的强类型版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM