使用实体框架返回数据表

use*_*256 12 c# entity-framework ado.net-entity-data-model

我正在使用实体框架.在我的应用程序中有一个特殊情况,我必须使用存储过程.由于在SP中编写了很多SQL语句,我不想​​在我的C#代码中重写它.我只需要以数据表的形式返回结果.我写了一些代码,但我一度陷入困境.有人可以填写下面的代码吗?

using (dbContext.Database.Connection)
{
dbContext.Database.Connection.Open();
DbCommand cmdItems= dbContext.Database.Connection.CreateCommand();
cmdItems.CommandText = "GetAvailableItems";
cmdItems.CommandType = CommandType.StoredProcedure;
cmdItems.Parameters.Add(new SqlParameter("jobCardId", 100525));
//Need to write code below to populate a DataTable.
}
Run Code Online (Sandbox Code Playgroud)

use*_*256 17

非常感谢你们.我解决了 这是解决方案:

using (var context = new DataBaseContext())
{
    var dt = new DataTable();
    var conn = context.Database.Connection;
    var connectionState = conn.State;
    try
    {
        if (connectionState != ConnectionState.Open) conn.Open();
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = "GetAvailableItems";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("jobCardId", 100525));
            using (var reader = cmd.ExecuteReader())
            {
                dt.Load(reader);
            }
        }
    }
    catch (Exception ex)
    {
        // error handling
        throw;
    }
    finally
    {
        if (connectionState != ConnectionState.Closed) conn.Close();
    }
    return dt;
}
Run Code Online (Sandbox Code Playgroud)

  • 这就是为什么我downvoted这个:这不使用实体实际上使用传统的sql围绕实体.这个飞行面对的实体应该维护数据库和本地数据之间的状态. (4认同)
  • 虽然有_are_用例...想想遗留应用程序需要重用数据库,但是正在编写新代码(我现在正在做什么).EF可以在很多地方工作,使生活变得更容易,但是有一些传统的sprocs返回不同的列(Pivoted表).当你的列名是动态的时候,我不知道将它映射到实体.当然可以.不是"EF友好"......但有时是现实生活的必需品 (4认同)
  • Re:虽然有用例.果然.但是,解决"使用实体框架返回数据表"的问题,这是一个糟糕的答案.另外一般情况下,除非你提到了例如你提到的例外情况,否则这对于人们的工作来说并不是一个好的代码.请参阅下面的答案. (4认同)
  • 约翰,我也是ORMs的字符串信徒,但这绝对不是一个糟糕的答案,事实上它在多方面比你的更好.有许多非常有效的原因可以直接获取DataTable,或者通常可以绕过EF实体层,同时还可以方便地使用EF连接配置.Upvoted (3认同)

F.S*_*lfi 10

该解决方案简单、快速且易于使用。

创建一个 DbContext 扩展:

using System.Data;
using System.Data.Common;
using System.Data.Entity;
..
..
public static class DbContextExtensions
{
    public static DataTable DataTable(this DbContext context, string sqlQuery)
    {
        DbProviderFactory dbFactory = DbProviderFactories.GetFactory(context.Database.Connection);

        using (var cmd = dbFactory.CreateCommand())
        {
            cmd.Connection = context.Database.Connection;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sqlQuery;
            using (DbDataAdapter adapter = dbFactory.CreateDataAdapter())
            {
                adapter.SelectCommand = cmd;

                DataTable dt = new DataTable();
                adapter.Fill(dt);

                return dt;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

例子:

using (MyDbContext db = new MyDbContext())
{
    string query = db.Students.Where(o => o.Age > 20).ToString();

    DataTable dataTable = db.DataTable(query);

    ..

    DataTable dt = db.DataTable(
                         (  from o in db.Studets
                            where o.Age > 20
                            select o
                         ).ToString()
                    );
}
Run Code Online (Sandbox Code Playgroud)

  • 这看起来像是完全绕过了实体框架。 (2认同)

Joh*_*ith 8

此示例将返回datatable从中选择数据的对象EntityFramework.

我相信这是实现目标的最佳解决方案.但是,此解决方案的问题是枚举每个记录.您可能希望先过滤列表,然后从列表中运行此列表以避免这种情况.

DataTable dt = new DataTable();
(from rec in database.Table.AsEnumerable()
                     select new
                     {
                         id = rec.id,
                         name = rec.Name
                         //etc
                     }).Aggregate(table, (dt, r) =>
                     {
                         dt.Rows.Add(r.id, r.Name);
                         return dt;
                     });
Run Code Online (Sandbox Code Playgroud)

  • 感谢John,我一直在寻找一种实际使用Entity Framework的方法. (2认同)
  • 很好,但是它根本不能回答这个特定问题。在这里的答案中,您有`datbase.Table`。在您的情况下,您正在使用实体,而问题与属性未知的数据表有关。使用DataTable,您可以观察返回的数据集,包括其列数和名称。当然还有数据。如果您在数千行代码中使用EF和Entities(主要是LinqToSQL或LinqToEntities),但是在一个实例中需要使用DataTable来观察未知数据集,那么您的答案将根本无效。 (2认同)