اليسار الخارجي تاريخ وموجود في LINQ إلى SQL C # .NET 3.5
-
03-07-2019 - |
سؤال
وأنا عالقة في ترجمة صلة خارجية يسرى الانضمام من 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 بالفعل تبين كيفية القيام بذلك. هنا هو مثال جيد: