Nano Hash - криптовалюты, майнинг, программирование

Как я могу создать запрос LINQ, если тип объекта неизвестен во время компиляции

Я разрабатываю настраиваемый веб-элемент управления, который может применять фильтры к объекту LinqDataSource. Это общий элемент управления, поскольку он должен работать с объектом определенного типа.

Элемент управления знает, с каким полем объекта он должен работать, по следующему полю

    /// <summary>
    /// Method to get compared column from object
    /// </summary>
    public Expression<Func<T, int>> GetColumnMethod;

(Я передаю ему метод, который получает соответствующее поле из типа объекта)

Мы выполняем фильтрацию с помощью такого кода

... if (selectedValue == "‹ = ") predicate = predicate.And (c => method (c)‹ = val); if (selectedValue == "‹ ") predicate = predicate.And (c => method (c)‹ val);

Все продолжается до тех пор, пока не произойдет преобразование LINQ to SQL. Тогда ошибка «Метод '.....' не поддерживает перевод в SQL.

конечно, CLR не умеет делать SQL для делегатов.

Если бы только C # мог скомпилировать выражение перед переводом в SQL, но я понятия не имею, как заставить его это сделать.

Извращения вроде Expression.Compile (какие бы хитрые приемы я ни пробовал целый день - я уже не могу их вспомнить ... ничего не помогло)

Но ... во время выполнения CLR уже знает тип моего объекта, поэтому ему удалось построить выражение SQL, скомпилировав значения делегата. Но как это сделать ? Бог знает.

Помощь очень признательна.

03.02.2009

Ответы:


1

Поставщик LINQ to SQL отвечает за преобразование вашего дерева выражения в действительный оператор T-SQL. Поскольку между C # и T-SQL нет отношения один-к-одному, весьма вероятно, что чем сложнее ваше дерево выражений, тем меньше вероятность того, что LINQ to SQL сможет преобразовывать.

Когда вы используете лямбда-выражение, вы должны решить, хотите ли вы его скомпилировать или использовать как дерево выражений. Если вы хотите использовать лямбда в качестве выражения, вы несете ответственность за то, чтобы выражение содержало функции и синтаксис, которые поддерживает ваш провайдер.

03.02.2009

2

Это не сработает. По сути, ваш запрос LINQ является допустимым кодом C #, поэтому он отлично компилируется, но не работает во время выполнения на чем-либо, выходящем за рамки поставщика LINQ to SQL.

Подробнее читайте здесь:

«Невозможно вызвать методы в DateTime» и другие ограничения

03.02.2009

3

Если это просто вопрос выбора конкретного поля для использования в вашем запросе, вы должны иметь возможность сделать это с помощью Expression.Compile «perversion». Но это, вероятно, потребует много работы. Вероятно, вы можете начать с компиляции того, что у вас есть сейчас, и использования Reflector для вывода, чтобы увидеть, как выглядит код, сгенерированный компилятором C #.

Можете ли вы разделить запрос на две части - одну, которая транслируется в SQL и выполняется на сервере, а другая использует ваш GetColumnMethod и запускается в памяти против данных, выводимых первой частью?

03.02.2009

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..