1

テーブルの名前とクエリする特定の列の値を受け取る部分的な結果ビューがあります。DBContext API を読んだところ、Set(Type) が CRUD 操作を実行できる DBSet を返す必要があることがわかりました。ユーザーはルックアップする PK を知らないため、PK なしで DBSet を正確にクエリする方法がわかりません。

従来の ADO を使用する方が簡単でしょうか?

編集: DbSet.SQLQuery 関数の使用方法はわかりましたが、結果を保存する手がかりがありません。デバッガーで要素を調べたところ、テーブル内のすべての行が見つかったため、SQLQuery は機能します。

public class SF1DB : DbContext
{
    //List of table names that feeds a DropDownList
    public DbSet<tablelist> tables { get; set; }

    //Data table
    public DbSet<dataTable1> dataTable1 { get; set; }
    public DbSet<dataTable2> dataTable2 { get; set; }
    //...list of other tables
}

public PartialViewResult GetFeatures(String tablelist, String[] countyfp)
{
    String type = "MvcApplication1.Models." + tablelist;
    Type dbType = Type.GetType(type);
    DbSet set = _db.Set(dbType);
    String sql = "select * from " + tablelist;

    //How do I store the result in a variable?
    set.SqlQuery(sql);
    return PartialView();
}
4

1 に答える 1

0

ユーザーが選択した DbSet と同じタイプの List を作成することで解決しました。次に、SQLQuery の GetEnumerator メソッドを使用して、結果を反復処理し、新しいリストに追加します。最後に、リストを部分ビューに渡します。

public PartialViewResult GetFeatures(String tablelist, String[] countyfp)
{
    String type = "MvcApplication1.Models." + tablelist;
    Type dbType = Type.GetType(type);
    DbSet set = _db.Set(dbType);
    String sql = "select * from " + tablelist + " where ";
    Type listType = typeof(List<>).MakeGenericType(dbType);
    IList list = (IList)Activator.CreateInstance(listType);

    for (int i = 0; i < countyfp.Length; i++)
    {
        sql += "cntyidfp like '%" + countyfp[i] + "'";
        if (i < (countyfp.Length - 1))
        {
            sql += " or ";
        }
    }

    IEnumerator result = set.SqlQuery(sql).GetEnumerator();
    while (result.MoveNext())
    {
        list.Add(result.Current);                
    }

    return PartialView(list);
}
于 2012-11-10T09:31:26.180 に答える