Ладно, сделаю. Я планировал разместить рекламу, но потом подумал, если выложу чисто рекламный пост, то наверняка повсюду будет летать кирпичей и яиц. ну, вставьте DAC. Что касается пользовательского LINQ. Позвольте мне объяснить код, поддерживающий выражения. Возможно, это будет полезно некоторым людям, которые пишут свой собственный уровень данных или хотят написать некоторые практические расширения LINQ. Даже если это бесполезно, это будет полезно. послужить «предложением», было бы здорово!
В предыдущих версиях DAC для запроса использовалось следующее выражение:
IEnumerable<Issue> q = this.dc.Query<Issue>(Issue._.IssueID >= 0);
Этот «милый» «_» кажется таким «незрелым», особенно в эпоху безудержного развития LINQ, он кажется очень «идущим в ногу со временем». Итак, существует версия v2.6, которая поддерживает расширение DAC LINQ.
var q = this.dc.Query<Issue>(s => s.IssueID > 0);
или
var q = from s in (this.dc.GetQueryableData<Issue>())
где s.IssueID > 0
выберите s;
Реализация двух вышеупомянутых методов в основном основана на анализе выражений и сборке операторов SQL. Пост Лао Чжао очень хорошо написан, а также вы можете посмотреть исходный код ЦАП (я вставляю рекламу).
Сегодня я главным образом хочу сказать: если у нас изначально есть собственное дерево выражений и его функция синтаксического анализа, можем ли мы легко «обновить» его для поддержки LINQ? ! Да, это легко!
var q = из s в SystemUser._
где s.FullName == s.FullName.Max
заказатьпо s.UserID
выберите s.Except(s.Password);
Чтобы разрешить объекту быть «where», «orderby», «select», разрешите ему реализовать методы с именами «Where», «OrderBy», «Select» или использовать метод расширения, как в DAC:
общедоступный статический класс QueryExpressionExtension
{
public static RaisingStudio.Data.Expressions.IQueryExpression<T> Где<T>(
этот источник RaisingStudio.Data.Expressions.IQueryExpression<T>,
Предикат Expression<Func<T, RaisingStudio.Data.Expressions.ConditionExpression>>)
{
return (новый RaisingStudio.Data.Expressions.QueryExpression<T>(
источник.Значение,
источник.Таблица,
(предикат.Компиляция())(источник.Значение),
источник.Столбцы));
}
public static RaisingStudio.Data.Expressions.IQueryExpression<T> OrderBy<T>(
этот источник RaisingStudio.Data.Expressions.IQueryExpression<T>,
Предикат Expression<Func<T, RaisingStudio.Data.Expressions.ColumnExpression>>)
{ … }
public static RaisingStudio.Data.Expressions.IQueryExpression<T> Select<T>(
этот источник RaisingStudio.Data.Expressions.IQueryExpression<T>,
Предикат Expression<Func<T, object>>)
{ ... }
}
В реализации метода вызовите метод Compile для входящего «системного» выражения, чтобы вернуть «пользовательское» выражение, а затем сохраните эти «пользовательские» выражения в «QueryExpression»)», когда «запрос» будет выполнен, сохраненное «пользовательское» выражение можно извлечь напрямую. Таким образом, запрос можно реализовать, используя исходный анализ «настраиваемого» выражения в приведенном выше коде! ! !