حسنًا، سأفعل ذلك. كنت أخطط لنشر إعلان، ولكن بعد ذلك فكرت، إذا قمت بنشر منشور إعلاني بحت، فأنا متأكد من أنه سيكون هناك الكثير من اللعنات والطوب والبيض المتطاير في كل مكان حسنًا، ضع 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
حدد الصورة؛
يعتمد تنفيذ الطريقتين المذكورتين أعلاه بشكل أساسي على تحليل التعبيرات وتجميع عبارات SQL. تمت كتابة منشور Lao Zhao بشكل جيد جدًا، ويمكنك أيضًا إلقاء نظرة على الكود المصدري لـ DAC (أقوم بإدخال الإعلانات).
ما أريد قوله بشكل أساسي اليوم هو، إذا كان لدينا في الأصل شجرة التعبير الخاصة بنا ووظيفة التحليل الخاصة بها، فهل يمكننا "ترقيتها" بسهولة لدعم LINQ؟ ! نعم، إنه سهل!
var q = من s في SystemUser._
حيث s.FullName == s.FullName.Max
الطلب حسب معرف المستخدم
حدد s.Except(s.Password);
للسماح للكائن بأن يكون "أين"، أو "ترتيب حسب"، أو "تحديد"، ثم السماح له بتنفيذ الأساليب المسماة "أين"، أو "OrderBy"، أو "تحديد"، أو استخدام طريقة Extension Method، تمامًا كما هو الحال في DAC:
فئة ثابتة عامة QueryExpressionExtension
{
RaisingStudio.Data.Expressions.IQueryExpression العام الثابت<T> حيث<T>(
هذا المصدر RaisingStudio.Data.Expressions.IQueryExpression<T>،
Expression<Func<T, RaisingStudio.Data.Expressions.ConditionExpression>> المسند)
{
العودة (RaisingStudio.Data.Expressions.QueryExpression الجديد<T>(
المصدر.القيمة،
المصدر.الجدول،
(المسند. ترجمة ()) (المصدر. القيمة)،
source.Columns));
}
RaisingStudio.Data.Expressions.IQueryExpression<T> OrderBy<T>(
هذا المصدر RaisingStudio.Data.Expressions.IQueryExpression<T>،
Expression<Func<T, RaisingStudio.Data.Expressions.ColumnExpression>> المسند)
{… }
RaisingStudio.Data.Expressions.IQueryExpression العام الثابت<T> حدد<T>(
هذا المصدر RaisingStudio.Data.Expressions.IQueryExpression<T>،
التعبير<Func<T,object>> المسند)
{ ... }
}
في تنفيذ الطريقة، قم باستدعاء طريقة التحويل البرمجي على تعبير "النظام" الوارد لإرجاع التعبير "المخصص"، ثم احفظ هذه التعبيرات "المخصصة" في "QueryExpression" ))، عند تنفيذ "الاستعلام"، يمكن إخراج التعبير "المخصص" المحفوظ مباشرةً، وبهذه الطريقة، يمكن تنفيذ الاستعلام باستخدام التحليل الأصلي للتعبير "المخصص" في الكود أعلاه! ! !