как использовать выражение в предложении выбора - PullRequest
0 голосов
/ 09 мая 2018

рассмотрим следующий псевдокод

Expression<Func<E,Datetime?>> expr = 
    e => (e.d1 ?? e.Rel.d1) ?? e.d2;
var q = myContext.E_DbSet.Select(x => new someDeclaredType {
    Id = x.Id,
    V = expr
});

=> CS0029 Не удается неявно преобразовать тип 'System.Linq.Expressions.Expression>' в 'System.DateTime?'

если я попробую скомпилировать

Expression<Func<E,Datetime?>> expr = 
    (e => (e.d1 ?? e.Rel.d1) ?? e.d2).Compile();
var q = myContext.E_DbSet.Select(x => new someDeclaredType {
    Id = x.Id,
    V = expr(x)
});

=> NotSupportedException: тип узла 'Invoke' выражения LINQ не поддерживается в LINQ to Entities.

Я прочитал Вызов выражения в операторе Select - LINQ to Entity Framework . Но это не мой точный случай. Мне нужно включить существующее выражение в мое предложение select. Это выражение приходит в результате вызова функции. Поэтому я должен использовать expr в своем предложении select.

Как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Я наконец нашел способ:

Expression<Func<E,Datetime?>> expr = 
    e => (e.d1 ?? e.Rel.d1) ?? e.d2;
Expression<Func<E,someDeclaredType>> sel = 
    x => new someDeclaredType {
        Id = x.Id,
        V = expr.Compile()(x)
    };
var q = myContext.E_DbSet.Select(sel.Compile());

другая кодировка (от @Anthony):

Expression<Func<E, someDeclaredType>> sel =
e => new someDeclaredType()
{
    Id = e.Id,
    V = expr.Compile()(e)
};
q = Files.Select(sel.Compile());

по образцу: dotnetfiddle

Пожалуйста, обратите внимание, что код не предназначен для ссылок на сущности. Это может вызвать исключение в linq к объекту из-за Rel = null.

0 голосов
/ 09 мая 2018

Может быть, что-то вроде этого:

Expression<Func<E,someDeclaredType>> expr = 
e => new someDeclaredType() 
{
    Id = e.Id, 
    V = (e.d1 ?? e.Rel.d1) ?? e.d2 
};
var q = myContext.E_DbSet.Select(expr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...