سؤال

أحاول إنشاء ملف not in بند مع معايير nhibernate API باستخدام nHlambdaextensions. قراءة الوثائق التي تمكنت من تنفيذ in بند من خلال القيام به

.Add(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }))

ومع ذلك ، عندما ألفها حولها SqlExpression.Not أحصل على الخطأ

Error   5   The best overloaded method match for 'NHibernate.LambdaExtensions.SqlExpression.Not<oms_dal.Models.Zone>(System.Linq.Expressions.Expression<System.Func<oms_dal.Models.Zone,bool>>)' has some invalid arguments
Error   6   Argument '1': cannot convert from 'NHibernate.Criterion.ICriterion' to 'System.Linq.Expressions.Expression<System.Func<oms_dal.Models.Zone,bool>>'

أنا أستخدم قطعة الكود هذه

.Add(SqlExpression.Not<Zone>(SqlExpression.In<Zone>(x => zoneAlias.ZoneId, new int[] { 1008, 1010 })))

كيف يمكنني تحقيق ذلك؟ باستخدام API المعايير العادية ، تمكنت من القيام بذلك

.Add(Restrictions.Not(Restrictions.In("z.ZoneId", new[] { 1008, 1010 })))
هل كانت مفيدة؟

المحلول

لم أعمل مع Criterion مباشرة (أنا أستخدم عمومًا LINQ2NH) ، لكن يبدو أنه لا يريد ببساطة Lambda منطقي ، لذلك لا يمكنك إعطائه معيارًا آخر. قد ينجح هذا ، على الرغم من أنني رأيت NH يواجه مشكلة مع أعضاء Array في Lambdas:

.Add(SqlExpression.Not<Zone>(z=>new[]{1008,1010}.Contains(z.ZoneId))

تحرير: حماقة. ما يحدث هنا هو أن الإطار لا يستخدم في الواقع Lambda ، لذلك في حين أن هذا يجمع ، فإن الإطار لا يطلق عليه أبدًا في عملية تشغيل الاستعلام. بدلاً من ذلك ، يتم فحص MSIL بشكل عكسي من المندوب ، والهندسة العكسية تعبير Lambda الخاص بك وتحويل ذلك إلى سلسلة لأمر SQL. هذا هو ، من الواضح ، عملية معقدة إلى حد ما يحاول المصممون تبسيطها من خلال جعلكم تحديد تلميحات حول ما تفعله (في هذه الحالة نوع sqlexpression الذي أعلنته) والبحث عن أنماط لتحديد العملية. في هذه الحالة ، على الرغم من ذلك ، حتى بالنظر إلى التلميحات ، فإن الإطار ليس لديه أدنى فكرة عما تحاول القيام به.

إذا لم يتمكن المترجم الكامن وراء تقييم الجمل ()

.Add(SqlExpression.Not<Zone>(z=>z.ZoneId == 1008
                                || z.ZoneId == 1010))

يعلم الخير أنه اضطررت إلى غليان التعبيرات بهذه الطريقة حتى يعمل linq2nhibernate بشكل صحيح.

نصائح أخرى

يبدو أن استخدام العالم القديم مع Lambdas يعمل:

.Add(Expression.Not(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top