Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用实体框架SqlQuery的变量表名将数据提取到实体类中_C#_Linq_Generics_Entity Framework 6 - Fatal编程技术网

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
    类的所有列

tbl是string-var,这是我想要创建动态方法的问题,我将表名作为string,我想要将string-varable转换为用户类。默认情况下,您不能这样做。您可以创建一个switch/case结构,该结构接受字符串并创建正确的类实例。但是你必须事先知道它们。@SamiKuhmonen这不是个坏主意,我以前也在考虑过,但我想知道它是否有更好的答案。我以前读过这篇文章,但我不想使用任何dose,因为它对我不起作用我想创建动态方法,我需要tbl var是一个泛型类或类似的东西,这对我来说没有意义-你有一个强大的、定义良好的类
用户
,那么你到底为什么想要动态呢
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");