LINQ إلى SQL الانضمام ويحتوي على المشغلين
-
26-09-2019 - |
سؤال
في الاستعلام التالي
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.