实体框架4.0代码优先动态查询

时间:2011-06-09 18:03:20

标签: entity-framework-4.1 ef-code-first

我想根据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的任何想法?所有帮助将不胜感激。

2 个答案:

答案 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