سؤال

وأنا عالقة في ترجمة صلة خارجية يسرى الانضمام من LINQToSQL وترجع الصفوف الأصلية فريدة من نوعها.

ولقد 2 الجداول (مشروع، Project_Notes، وانها علاقة 1-العديد تربطها PROJECT_ID). أنا أفعل كلمات البحث على أعمدة متعددة على الطاولة (2) وأريد الوحيد لعودة مشاريع فريدة من نوعها إذا يحتوي على عمود في Project_Notes على الكلمة. لدي هذا التسلسل linqtoSQl الذهاب لكن يبدو أن عودته متعددة الصفوف المشروع. ربما القيام Exist بطريقة أو بأخرى في LINQ؟ أو ربما groupby من نوع ما؟

وهنا يكمن LINQToSQL:

 query = from p in query
 join n in notes on p.PROJECT_ID equals n.PROJECT_ID into projectnotes
 from n in notes.DefaultIfEmpty()
 where n.NOTES.Contains(cwForm.search1Form)
 select p;

وهنا تكمن SQL أنتجت من التعريف

<اقتباس فقرة>   

والمخزن sp_executesql إكسيك N'SELECT [T2]. [عنوان]، [T2]. [الدولة]، [T2]. [PROJECT_ID]،   [T2]. [PROVIDER_ID]، [T2]. [CATEGORY_ID]، [T2]. [المدينة]، [T2]. [UploadedDate]،   [T2]. [SubmittedDate]، [T2]. [Project_Type] FROM (SELECT ROW_NUMBER () OVER (ORDER BY   [T0]. [UploadedDate]) AS [ROW_NUMBER]، [T0]. [عنوان]، [T0]. [الدولة]، [T0]. [PROJECT_ID]،   [T0]. [PROVIDER_ID]، [T0]. [CATEGORY_ID]، [T0]. [المدينة]، [T0]. [UploadedDate]،   [T0]. [SubmittedDate]، [T0]. [Project_Type] FROM [DBO]. [المشاريع] AS [T0] LEFT صلة خارجية   [DBO]. [PROJECT_NOTES] AS [T1] ON 1 = 1 حيث ([T1]. [NOTES] مثل @ P0) AND   ([T0] .SubmittedDate]> = @ P1) AND ([T0]. [SubmittedDate] <@ P2) AND ([T0]. [PROVIDER_ID] =   @ P3) AND ([T0]. [CATEGORY_ID] IS NULL)) AS [T2] حيث [T2]. [ROW_NUMBER] بين @ P4 + 1   و @P4 + @ P5 ORDER BY [T2]. [ROW_NUMBER] '، N' VARCHAR @ P0 (9)، @ P1 التاريخ والوقت، @ p2 والتاريخ والوقت، @ P3   كثافة العمليات، @ P4 كثافة العمليات، @ P5 كثافة العمليات '، @ P0 ='٪ شيكاغو٪ '، @ P1 =' '2000/09/02 00: 00: 00: 000' '، @ P2 =' '2009-03-02   00: 00: 00: 000 ''، @ P3 = 1000، @ P4 = 373620، @ P5 = 20

وهذا الاستعلام بإرجاع كافة mutiples العلاقة 1 عديدة في النتائج. لقد وجدت كيفية القيام Exists في LINQ من هنا. HTTP: / /www.linq-to-sql.com/linq-to-sql/t-sql-to-linq-upgrade/linq-exists/

وهنا هو LINQToSQL باستخدام Exists:

query = from p in query
where (from n in notes
where n.NOTES.Contains(cwForm.search1Form)
select n.PROJECT_ID).Contains(p.PROJECT_ID)
select p;

والبيان SQL ولدت:

<اقتباس فقرة>   

وإكسيك COUNT المخزن sp_executesql N'SELECT (*) AS [قيمة] FROM [DBO]. [المشاريع] AS [T0] WHERE   (المشرقية (SELECT NULL AS [فارغ] FROM [DBO]. [PROJECT_NOTES] AS [T1] WHERE   ([T1] .PROJECT_ID] = ([T0]. [PROJECT_ID])) AND ([T1]. [NOTES] مثل @ P0))) AND   ([T0]. [SubmittedDate]> = @ P1) AND ([T0]. [SubmittedDate] <@ P2) AND ([T0]. [PROVIDER_ID] =   @ P3) AND ([T0]. [CATEGORY_ID] IS NULL)، N 'VARCHAR @ P0 (9)، @ P1 التاريخ والوقت، @ p2 والتاريخ والوقت، @ P3   الباحث '، @ P0 ='٪ شيكاغو٪ '، @ P1 =' '2000/09/02 00: 00: 00: 000' '، @ P2 =' '2009-03-02   00: 00: 00: 000 ''، @ P3 = 1000

وأحصل على مهلة SQL من databind() من استخدام Exists.

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

المحلول

<اقتباس فقرة>   

ويبدو أن عودة متعددة الصفوف مشروع

نعم، هذه هي الطريقة التي يعمل الانضمام. إذا كان المشروع 5 مذكرات مطابقة، وتظهر 5 مرات.


ما إذا كانت المشكلة هي - "تاريخ" هو تعبير خاطئ

وأنت تريد تصفية المشاريع لتلك التي تحتوي على نص معين الملاحظات:

var query = db.Project
  .Where(p => p.Notes.Any(n => n.NoteField.Contains(searchString)));

نصائح أخرى

وأنت ستكون لدينا لاستخدام أسلوب تمديد DefaultIfEmpty. هناك بعض الأسئلة على SO بالفعل تبين كيفية القيام بذلك. هنا هو مثال جيد:

كيف يمكنني إجراء تداخل تاريخ، إضافة، والمجموعة في LINQ؟

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