سؤال

في الاستعلام التالي

  var restrictions = from p in dcTrad.quop_restricted_items
                           where p.entry_status == 'P' && p.batch == "PRODUCTION" && p.problem != null
                           from q in dcTrad.model_companies
                           where   q.co_name != null && p.brimsec == q.primary_bsec                            
                           select new { Company = q.co_name, Restriction = p.comment ?? "Restricted without comments", Portfolio = p.problem };

أنا بحاجة إلى استبدال

p.brimsec == q.primary_bsec 

مع

p.brimsec.StartsWith ( q.primary_bsec  )

لكني أحصل على الخطأ التالي:

Only arguments that can be evaluated on the client are supported for the String.StartsWith method

كيف يمكنني جعل هذا العمل؟

هل كانت مفيدة؟

المحلول

في الأساس ، لا يعرف LINQ إلى SQL كيفية تحويل Startswith إلى SQL. هذا لأنه داخليًا في وقت التشغيل ، يتم إنشاء رمز LINQ الخاص بك إلى SQL.

يمكنك الحصول على تحقيق ذلك عن طريق إنشاء وظيفة UDF (المستخدم المحدد في SQL) واستخدامه من عبارة LINQ.

المقال كما هو موضح أدناه:http://msdn.microsoft.com/en-us/library/bb399416.aspx

أندرو

نصائح أخرى

لسوء الحظ ، فإن مترجم LINQ إلى SQL ليس ذكيًا بما يكفي لترجمة هذا الرمز ، ولكن هناك خدعة تحقق نفس الشيء:

p.brimsec.StartsWith ( q.primary_bsec  )

يترجم إلى:

p.brimsec.SubString(0, q.primary_bsec.Length) == q.primary_bsec

يتعامل مترجم LINQ إلى SQL مع هذا بشكل جيد ، والدلالات تعادل البدء.

بصراحة ، لا أرى سبب ترجمة Startswith بشكل صحيح للوسائط من جانب الخادم كانت صعبة لدرجة أن مطوري LINQ قرروا فقط إلقاء خطأ بدلاً من ذلك.

أعتقد أن المشكلة التي تواجهها هي أن LINQ-to-SQL ليس لديه ترجمة للسلسلة. تعمل string.contains ، على الرغم من ذلك - ستحتاج إلى المرور من خلال مجموعتك الناتجة وتصفية العناصر التي لا تبدأ بـ Q.Primary_BSEC.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top