Entity Framework 4.0 динамический запрос с первым кодом - PullRequest
1 голос
/ 09 июня 2011

Я бы хотел запросить таблицу на основе списка 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, где метод больше не доступен.К счастью, я где-то увидел статью (больше не помню), в которой предлагалось преобразовать DbContext в IObjectContextAdapter, а затем вызвать CreateQuery следующим образом:

var result = ((IObjectContextAdapter)context)
                .ObjectContext.CreateQuery<Node>(whereClause.ToString(), parameters.ToArray());

К сожалению, этовыдает ошибку:

'{ColumnName}' не может быть разрешен в текущей области или контексте.Убедитесь, что все ссылочные переменные находятся в области видимости, что необходимые схемы загружены и что на пространства имен ссылаются правильно.

Где {ColumnName} - это столбец, указанный в whereClause.

Есть идеи, как я могу динамически запрашивать DbSet по списку пар ключ / значение?Вся помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

Я думаю, что ваша самая первая проблема заключается в том, что в первом примере вы используете 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 голос
/ 09 июня 2011

Не могли бы вы использовать расширение WhereIf, созданное в этом похожем ответе / вопросе - Код Entity Framework First & Search Criteria

...