9

MVC 4 および EF 5 では、動的クエリを実行したいと考えています。

var returndata = Context.Database.SqlQuery(Type, strsql, null);

いくつのフィールドが返され、名前が付けられるかわかりません。この結果から、ビューに表示されるテーブル構造を作成したいと考えています。

質問: Type として何を渡す必要がありますか?

私のクエリは結果の下に戻ります:

フィールド 1、フィールド 2、フィールド 3、フィールド 4、フィールド 5

行 1...

行 2..

提案をいただければ幸いです。

4

8 に答える 8

25

EF はそれをサポートしていないため、生の SQL クエリを使用できます。

private static IEnumerable<object[]> Read(DbDataReader reader)
{
    while (reader.Read())
    {
        var values = new List<object>();
        for (int i = 0; i < reader.FieldCount; i++)
        {
            values.Add(reader.GetValue(i));
        }
        yield return values.ToArray();
    }
}

その後:

public ActionResult Index()
{
    using (var ctx = new UsersContext())
    using (var cmd = ctx.Database.Connection.CreateCommand())
    {
        ctx.Database.Connection.Open();
        cmd.CommandText = "SELECT * FROM UserProfile";
        using (var reader = cmd.ExecuteReader())
        {
            var model = Read(reader).ToList();
            return View(model);
        }
    }
}

そして最後にあなたの見解で:

@model IEnumerable<object[]>
<table>
    <tbody>
        @foreach (var row in Model)
        {
            <tr>
                @foreach (var column in row)
                {
                    <td>@column</td>
                }
            </tr>
        }
    </tbody>
</table>
于 2013-03-31T17:51:57.393 に答える
11

このメソッドは、SQL select (パラメーター付き) から行のリストにデータをロードします。ここで、各行は列の辞書です (キーは列名です)。

private static List<Dictionary<string, object>> LoadData(string sqlSelect, params object[] sqlParameters)
{
    var table = new List<Dictionary<string, object>>();
    using (var ctx = new DbEntities())
    {
        ctx.Database.Connection.Open();
        using (var cmd = ctx.Database.Connection.CreateCommand())
        {
            cmd.CommandText = sqlSelect;
            foreach (var param in sqlParameters)
                cmd.Parameters.Add(param);
            using (var reader = cmd.ExecuteReader())
            {
                while (reader.Read())
                {
                    var row = new Dictionary<string, object>();
                    for (int i = 0; i < reader.FieldCount; i++)
                        row[reader.GetName(i)] = reader[i];
                    table.Add(row);
                }
            }
        }
    }
    return table;
}
于 2015-02-09T09:02:17.107 に答える
0

同様に Darin Dimitrov による投稿ですが、DataTable を返します

public DataTable QueryToTable(Entities db, string queryText, SqlParameter[] parametes)
        {
            using ( DbDataAdapter adapter = new SqlDataAdapter())
            {
                adapter.SelectCommand = db.Database.Connection.CreateCommand();
                adapter.SelectCommand.CommandText = queryText;
                if (parametes != null)
                    adapter.SelectCommand.Parameters.AddRange(parametes);
                DataTable table = new DataTable();
                adapter.Fill(table);
                return table;
            }
        }

使用する

SqlParameter[] parametes = new[]
                {
                    new SqlParameter("date_from", dateFrom)
                };

DataTable tab = QueryToTable(new Entities(), 
               "Select *  From SomeTable Where ADate >= @date_from", parametes);

MS SQL Server の例

于 2013-12-24T06:20:58.130 に答える
0

返される型について何も知らずに、運が悪いのではないかと思います。

該当するパターンがわかっている場合は、try { } catch () { }動的クエリのパラメーターに一致するインターフェイスでいくつかの を使用できますが、それは少し面倒なようです。

于 2013-03-31T18:08:25.963 に答える