Когда EF или LINQ to SQL запускает запрос, он:
- Создает дерево выражений из кода,
- Преобразует дерево выражений в запрос SQL,
- Выполняет запрос, получает необработанные результаты из базы данных и преобразует их в результат, который будет использоваться приложением.
Глядя на трассировку стека, я не могу понять, где происходит вторая часть.
В общем, возможно ли использовать существующую часть EF или (предпочтительно) LINQ to SQL для преобразования объекта Expression
в частичный запрос SQL (с использованием синтаксиса Transact-SQL), или мне нужно заново изобретать колесо
Обновление: комментарий просит предоставить пример того, что я пытаюсь сделать.
На самом деле, ответ Райана Райта ниже прекрасно иллюстрирует то, чего я хочу достичь в результате, за исключением того факта, что мой вопрос конкретно о , как я могу сделать это, используя существующие механизмы .NET Framework фактически используется EF и LINQ to SQL , вместо того, чтобы заново изобретать колесо и писать тысячи строк не проверенного кода, чтобы сделать то же самое.
Вот также пример. Опять же, обратите внимание, что ORM-сгенерированный код отсутствует.
private class Product
{
[DatabaseMapping("ProductId")]
public int Id { get; set; }
[DatabaseMapping("Price")]
public int PriceInCents { get; set; }
}
private string Convert(Expression expression)
{
// Some magic calls to .NET Framework code happen here.
// [...]
}
private void TestConvert()
{
Expression<Func<Product, int, int, bool>> inPriceRange =
(Product product, int from, int to) =>
product.PriceInCents >= from && product.PriceInCents <= to;
string actualQueryPart = this.Convert(inPriceRange);
Assert.AreEqual("[Price] between @from and @to", actualQueryPart);
}
Откуда берется имя Price
в ожидаемом запросе?
Имя можно получить с помощью отражения, запросив пользовательский атрибут DatabaseMapping
свойства Price
класса Product
.
Откуда появляются имена @from
и @to
в ожидаемом запросе?
Эти имена являются фактическими именами параметров выражения.
Откуда берется between … and
в ожидаемом запросе?
Это возможный результат двоичного выражения. Возможно, EF или LINQ to SQL вместо оператора between … and
будут использовать [Price] >= @from and [Price] <= @to
. Это тоже нормально, это не имеет значения, поскольку результат логически одинаков (я не говорю о производительности).
Почему в ожидаемом запросе нет where
?
Поскольку в Expression
ничего не указано, что должно быть ключевое слово where
. Может быть, фактическое выражение - это только одно из выражений, которое позже будет объединено с бинарными операторами, чтобы создать больший запрос с символом where
.