EntitySet مقابل أداء الاستعلام الجدول في مصمم الرسم Linq2SQL

StackOverflow https://stackoverflow.com/questions/200755

سؤال

في LINQ إلى SQL الدرجة، لماذا هي الخصائص التي تم إنشاؤها من المفاتيح الخارجية EntitySet الأشياء، التي تنفذ IEnumerable، حيث والكائنات على DataContext هي كائنات Table التي تنفذ IQueryable؟

تعديل: للتوضيح، وهنا مثال يوضح ما أحاول أن أفهم. هذا المثال:

ctx.Matches.Where(x => x.MatchID == 1).Single()
           .MatchPlayers.Max(x => x.Score);

ويضرب قاعدة البيانات مرتين حيث ما يلي:

ctx.MatchPlayers.Where(x => x.MatchID == 1)
                .Max(x => x.Score);

ويعمل فقط 1 الاستعلام. وهنا آثار:

exec sp_executesql N'SELECT [t0].[MatchID], [t0].[Date]
FROM [dbo].[Matches] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go
exec sp_executesql N'SELECT [t0].[MatchID], [t0].[PlayerID], [t0].[Score]
FROM [dbo].[MatchPlayers] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go

و

exec sp_executesql N'SELECT MAX([t0].[Score]) AS [value]
FROM [dbo].[MatchPlayers] AS [t0]
WHERE [t0].[MatchID] = @p0',N'@p0 int',@p0=1
go

ومما يدل أيضا أنه حتى أسوأ من ذلك، يتم الحد الأقصى في # مستوى C وليس في قاعدة البيانات.

وأنا أعلم أن السبب يحدث هذا هو الفرق بين IQueryables وIEnumerables، فلماذا لا الكائن MatchPlayers في المثال الأول بتطبيق واجهة IQueryable للحصول على نفس الفوائد كما في المثال الأخير.

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

المحلول

والجداول بشكل فعال مسألة المفاهيمية - وجدت حقا على الخادم، لذلك تحتاج إلى الاستعلام للحصول على المدخلات. إدخالات المفاتيح الخارجية هي تلك التي بيعت في الواقع من قبل استفسار آخر، لذلك عند هذه النقطة تكون متوفرة محليا. هذا وصفا صوفي إلى حد ما، ولكن نأمل أن يحصل على المفهوم العام.

نصائح أخرى

ctx.Matches.Where(x => x.MatchID == 1).Single()

واحدة () بإرجاع المباراة، وليس IQueryable (مباراة).

ومجرد الضغط احدة () قبالة إلى الخطوة الأخيرة:

ctx.Matches
  .Where(m => m.MatchID == 1)
  .Select(m => m.MatchPlayers.Max(mp => mp.Score))
  .Single();

وماذا يظهر هذا الاستعلام يعني، أن كل شيء على مايرام لاستخدام الخاصية MatchPlayers في استعلام. الذي يتناول تفسيري لسؤال السائل و- "لماذا لا يمكنني استخدام EntitySet في استعلام؟"، يمكنك

.

وكان هذا <وأ href = "http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/121ec4e8-ce40-49e0-b715-75a5bd0063dc/" يختلط = "نوفولو noreferrer" عنوان = "لماذا لم يعد EntitySet تنفيذ IQueryable؟"> تناولها في المحافل MSDN . جوهر المنطق هو أنه من الصعب جدا تعقب الأجسام المضافة وإزالة حين جعل استعلامات مقابل قاعدة البيانات. بدلا من ذلك، EntitySet شيء من نسخة محلية من الكائنات ذات الصلة التي يمكنك التلاعب. للأسف، كما لاحظت، وهذا له تأثير جانب تفويض التعبيرات في LINQ إلى كائنات يدعو بدلا من ذلك أفضل أداء LINQ إلى SQL.

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