Дерево выражений не может содержать динамическую операцию - PullRequest
2 голосов
/ 11 апреля 2011

Я получаю эту ошибку, если я пытаюсь передать значение динамического типа в запрос linq для структуры сущности.

dynamic sname = "suraj";    // even object, var
AppUser appUser = Ctx.AppUsers.First(u => u.Name == sname);

Если я пытаюсь сохранить значение первым в строке и использовать его, я получаю "ошибка ссылки на объект".

var name = "suraj";
string sname = new string(((string)name).ToCharArray());

AppUser appUser = Ctx.AppUsers.First(u => u.Name == sname);

Ответы [ 2 ]

4 голосов
/ 11 апреля 2011

Взгляните на DLINQ , который позволяет вам делать такие вещи, как:

var query =
    db.Customers.
    Where("City = @0 and Orders.Count >= @1", "London", 10).
    OrderBy("CompanyName").
    Select("new(CompanyName as Name, Phone)");

Обратите внимание, что выражения в запросе - это строки, которые могли быть динамически созданы во время выполнения.

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

( DLINQ довольно удивителен, если вспомнить, как он писал в 2006 году, и все еще находится в авангарде технологических достижений C # ; Загрузка включена в каталог \ LinqSamples \ DynamicQuery здесь )

1 голос
/ 22 января 2013

Аналогично ответу @ Suraj's , поскольку dynamic, видимо, нормально для делегата (Func), но не для Expression, тогда вы можете преобразовать делегата в выражение

dynamic config = JsonConvert.DeserializeObject(configJsonString);
var typeName = config.type.ToString(); // clause expects a string, just separating it out for readability

// the guts of your clause --
// we'll turn this into an expression with o => wrapper(o)
Func<TEntity, bool> wrapper = (n => n.Name == typeName);

// wrap to expression and use as regular clause
var expectedType = repository.Where(o => wrapper(o)).FirstOrDefault();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...