[英]How to determine the next primary key from a database table for a generic entity using Entity Framework Core?
[英]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或DbSet
) DbSet
转换为ObjectQuery
,后者是Entity SQL的基础。 默认情况下,命令文本使用“ it”作为查询中表的别名,因此,如果您想要一个特定字段的值,则必须在其前面加上别名作为前缀。
Select
返回一个DbDataRecord
。 返回该记录的第一个值。
与其他方法相比,此方法的优势在于它仅查询数据库中的请求字段。
当然,如果您事先知道有问题的字段的类型,则可以制作此方法的强类型版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.