Я работаю над универсальным c репозиторием для Entity Framework. Для поиска значений у меня есть метод Find в моем хранилище, который принимает выражение. Во время этого процесса я хочу записать выражение. Я делаю это, получая expression.Body
.
Вот мой код
public async Task<TEntity> FindFirstOrDefault<TEntity>(Expression<Func<TEntity, bool>> expression) where TEntity : class
{
string expBody = expression.Body.ToString();
// Log expBody here
return await _context.Set<TEntity>().Where(expression).FirstOrDefaultAsync().ConfigureAwait(false);
}
Приведенный выше код прекрасно работает при тестировании с жестко закодированным условием, подобным этому.
var blogs = await uow.Repository.FindFirstOrDefault<Blog>(x => x.BlogId == 1).ConfigureAwait(false);
Когда я отлаживаю, эта строка содержит expBody
со значением (x.BlogId == 1)
Однако, если я сделаю сравнение с такой переменной:
int id = 1;
var blogs = await uow.Repository.FindFirstOrDefault<Blog>(x => x.BlogId == id).ConfigureAwait(false);
, я получу это для expBody
:
(x.BlogId == value(TestProject.ValueService+<>c__DisplayClass4_0).intId)
Как получить фактическое тело выражения, например, когда я использую жестко закодированное значение, когда я на самом деле ссылаюсь на переменную?