我想根据KeyValuePair
列表查询表格。使用Model-First方法,我可以执行以下操作:
var context = new DataContext();
var whereClause = new StringBuilder();
var objectParameters = new List<ObjectParameter>();
foreach(KeyValuePair<string, object> pair in queryParameters)
{
if (whereClause.Length > 0)
whereClause.Append(" AND ");
whereClause.Append(string.Format("it.[{0}] = @{0}", pair.Key));
parameters.Add(new ObjectParameter(pair.Key, pair.Value));
}
var result = context.Nodes.Where(whereClause.ToString(), parameters.ToArray());
现在我正在使用Code-First方法,this Where method不再可用。幸运的是,我在某个地方看到了一篇文章(我已经记不起了),这篇文章建议我可以将DbContext
转换为IObjectContextAdapter
,然后像这样调用CreateQuery
:
var result = ((IObjectContextAdapter)context)
.ObjectContext.CreateQuery<Node>(whereClause.ToString(), parameters.ToArray());
不幸的是,这会引发错误:
无法在当前范围或上下文中解析'{ColumnName}'。确保所有引用的变量都在范围内,加载了所需的模式,并且正确引用了名称空间。
{ColumnName} 是whereClause
中指定的列。
在给定键/值对列表的情况下,如何动态查询DbSet
的任何想法?所有帮助将不胜感激。
答案 0 :(得分:2)
我认为您的第一个问题是,在第一个示例中,您在实体集上使用Where
但在第二个示例中您使用的是CreateQuery
,因此您必须传递完整的ESQL查询,而不仅仅是where子句!尝试类似:
...
.CreateQuery<Node>("SELECT VALUE it FROM ContextName.Nodes AS it WHERE " + yourWhere)
最有问题的是FROM
部分中的完整实体集名称。我认为它被定义为上下文类的名称和在上下文中公开的DbSet
的名称。另一种方法是创建ObjectSet
:
...
.ObjectContext.CreateObjectSet<Node>().Where(yourWhere)
答案 1 :(得分:1)
您是否可以使用在此类似答案/问题中创建的WhereIf扩展程序 - Entity Framework Code First & Search Criteria