سؤال

أنا أستخدم enumerable.todictionary لإنشاء قاموس من مكالمة LINQ:

return (from term in dataContext.Terms
        where term.Name.StartsWith(text)
        select term).ToDictionary(t => t.TermID, t => t.Name);

هل ستجلب هذه المكالمة مجملًا لكل مصطلح ، أم أنها ستسترجع فقط الحقول المرفقة وحقول الأسماء من مزود البيانات الخاص بي؟ بمعنى آخر ، هل سأوفر لحركة قاعدة البيانات بنفسي إذا كتبت ذلك بدلاً من ذلك:

return (from term in dataContext.Terms
        where term.Name.StartsWith(text)
        select new { term.TermID, term.Name }).ToDictionary(t => t.TermID, t => t.Name);
هل كانت مفيدة؟

المحلول

enumerable.Todictionary يعمل على الأشياء غير المصممة. الجزء الأول من بيانك "(من ... SELECT TERM") هو كائن iqueryable. سوف ينظر Queryable إلى التعبير وبناء بيان SQL. سيقوم بعد ذلك بتحويل ذلك إلى eenumerable لتمرير إلى todictionary ().

بمعنى آخر ، نعم ، سيكون الإصدار الثاني أكثر كفاءة.

نصائح أخرى

ستعود SQL التي تم إنشاؤها إلى المصطلح بأكمله ، وبالتالي فإن البيان الثاني الخاص بك سيسقط ما تحتاجه.

يمكنك ضبط dataContext.Log = Console.Out ونظر إلى النتائج المختلفة للاستعلام.

باستخدام نموذج قاعدة بيانات LINQPAD الخاصة بي ، إليك مثال:

var dc = (TypedDataContext)this;

// 1st approach
var query = Orders.Select(o => o);
dc.GetCommand(query).CommandText.Dump();
query.ToDictionary(o => o.OrderID, o => o.OrderDate).Dump();

// 2nd approach
var query2 = Orders.Select(o => new { o.OrderID, o.OrderDate});
dc.GetCommand(query2).CommandText.Dump();
query2.ToDictionary(o => o.OrderID, o => o.OrderDate).Dump();

SQL المولدة (أو مجرد نظرة خاطفة على علامة التبويب SQL Linqpad):

// 1st approach
SELECT [t0].[OrderID], [t0].[OrderDate], [t0].[ShipCountry]
FROM [Orders] AS [t0]

// 2nd approach
SELECT [t0].[OrderID], [t0].[OrderDate]
FROM [Orders] AS [t0]

رقم. ToDictionary هي طريقة تمديد ل IEnumerable<T> ليس IQueryable<T>. لا يستغرق الأمر Expression<Func<T, TKey>> ولكن ببساطة أ Func<T, TKey> أنه سوف يستدعي بشكل أعمى لكل عنصر. لا يهتم (ولا يعرف) عن LINQ وأشجار التعبير الأساسية وأشياء من هذا القبيل. إنه يكرر التسلسل ويبني القاموس. نتيجة لذلك ، في استعلامك الأول ، يتم جلب جميع الأعمدة.

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