2012-11-09 62 views
1

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

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

你能否提供一个你想要实现的例子,如果你不想让它变成动态的? – barry

+0

我可以使用40个if语句来确定用户想查询哪个表,然后通过DbContext进行查询。 – MooCow

回答

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); 
}