C# 使用实体框架SqlQuery的变量表名将数据提取到实体类中
我想将字符串变量转换为实体框架类,但现在不知道如何转换。 我找了很多,但什么也没找到C# 使用实体框架SqlQuery的变量表名将数据提取到实体类中,c#,linq,generics,entity-framework-6,C#,Linq,Generics,Entity Framework 6,我想将字符串变量转换为实体框架类,但现在不知道如何转换。 我找了很多,但什么也没找到 public JsonResult GetReports(string tbl) { using (Context db = new Context()) { // *** Problem is that tbl is string and I want to Cast tbl // to Users Class OR eny of my other
public JsonResult GetReports(string tbl)
{
using (Context db = new Context())
{
// *** Problem is that tbl is string and I want to Cast tbl
// to Users Class OR eny of my other Class
var result= db.Database.SqlQuery<tbl>("SELECT * FROM Users");
return Json(new { data = result});
}
}
public partial class Users
{
public int ID { get; set; }
public string Name { get; set; }
public string Family { get; set; }
public Nullable<bool> Gender { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public string Mobile { get; set; }
public bool Deleted { get; set; }
}
公共JsonResult GetReports(字符串tbl)
{
使用(Context db=new Context())
{
//***问题是tbl是字符串,我想转换tbl
//到用户类或我的其他类的eny
var result=db.Database.SqlQuery(“从用户中选择*);
返回Json(新的{data=result});
}
}
公共部分类用户
{
公共int ID{get;set;}
公共字符串名称{get;set;}
公共字符串族{get;set;}
公共可空性别{get;set;}
公共字符串用户名{get;set;}
公共字符串密码{get;set;}
公共字符串电子邮件{get;set;}
公共字符串Mobile{get;set;}
公共bool已删除{get;set;}
}
我之所以想这样做,是因为我想使用一些动态方法,
tbl
可以是我的任何表名(作为字符串)通用方法
考虑到您有强命名类(如用户
),应该没有理由求助于弱或动态方法
例如,如果需求是构建一个通用存储库查询功能,它会使数据访问代码干涸,并可能引入常见的横切关注点,如日志记录、检测、可能的重试和异常处理,那么您可以在SqlQuery
周围使用一个通用包装器:
好处是myUsers
是一个强类型集合
动态方法
从理论上讲,可以用答案来回答你原来的问题。您可以直接传入System.Type
,也可以将其他一些关键抽象映射到该类型,例如:
private static readonly IReadOnlyDictionary<string, Type> MyTypeMap
= new Dictionary<string, Type>
{
{ "users", typeof(Users)},
{ "foo", typeof(Foo)},
... other type maps here
};
public async Task<IEnumerable<object>> WeakQuery(string someType, string someQuery)
{
Type typeOfMyClass;
if (MyTypeMap.TryGetValue(someType, out typeOfMyClass))
{
using (var db = new DbContext(ConnString))
{
return await db.Database.SqlQuery(typeOfMyClass, someQuery)
.ToListAsync()
.ConfigureAwait(false);
// The problem now is that you get an untyped DbRawSqlQuery
}
}
return Enumerable.Empty<object>();
}
- 尽量避免
——而是显式选择要映射到SELECT*
类的所有列Users
用户
,那么你到底为什么想要动态呢SqlQuery
是一个通用重载,因此您可以自由地围绕它构建自己的通用包装器。上面的动态解决方法链接使用了另一个重载,即SqlQuery(Type,…)
I已经更新了答案。在我看来,SqlQuery
的整个要点就像Dapper
,能够快速地将行反序列化为强类型对象。如果您使用弱类型,那么最好使用SqlDataReader
并按顺序值提取字段。如果对我有用的话,我明天就告诉你:)非常感谢。我从你那里学到了两件事。布特法很好,也很方便。我用第二种方法,但记住第一种
var repo = new MyRepo();
var myUsers = await repo.TypedQuery<Users>("SELECT Id, Name FROM Users");
private static readonly IReadOnlyDictionary<string, Type> MyTypeMap
= new Dictionary<string, Type>
{
{ "users", typeof(Users)},
{ "foo", typeof(Foo)},
... other type maps here
};
public async Task<IEnumerable<object>> WeakQuery(string someType, string someQuery)
{
Type typeOfMyClass;
if (MyTypeMap.TryGetValue(someType, out typeOfMyClass))
{
using (var db = new DbContext(ConnString))
{
return await db.Database.SqlQuery(typeOfMyClass, someQuery)
.ToListAsync()
.ConfigureAwait(false);
// The problem now is that you get an untyped DbRawSqlQuery
}
}
return Enumerable.Empty<object>();
}
var repo = new MyRepo();
dynamic x = await repo.WeakQuery("users", "SELECT Id, Name, Gender FROM Users");
Assert.IsNotNull(x);
Assert.IsTrue(Enumerable.First(x).Name == "Foo");