动态DBSet查找和查询

时间:2012-11-09 09:58:15

标签: asp.net-mvc entity-framework

我有一个部分结果视图,它接受表的名称和要查询的特定列的值。我读了DBContext API,发现Set(Type)应该返回一个可以对其进行CRUD操作的DBSet。我不知道如何在没有PK的情况下查询DBSet,因为用户不知道要查找的PK。

可能使用Classic 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();
}

1 个答案:

答案 0 :(得分: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);
}