1

我有一个部分结果视图,其中包含表的名称和要查询的特定列的值。我阅读了 DBContext API,发现 Set(Type) 应该返回一个 DBSet,您可以对它进行 CRUD 操作。我不知道如何在没有 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();
}
4

1 回答 1

0

我通过创建一个与用户选择的 DbSet 具有相同类型的列表来解决这个问题。然后我使用 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 回答