كيف تكتب هذا LINQ SQL كاستعلام ديناميكي (باستخدام السلاسل)؟

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

سؤال

انتقل إلى "السؤال المحدد" حسب الحاجة. بعض الخلفية:

السيناريو: لدي مجموعة من المنتجات مع مرشح "DRINON DOWN" (كائن الاستعلام) ملء مع DDLs. سيؤدي كل اختيار DDL التدريجي إلى الحد من قائمة المنتجات بالإضافة إلى الخيارات التي يتم تركها لـ DDLs. على سبيل المثال ، يحد اختيار مطرقة خارج الأدوات من أحجام المنتج لإظهار أحجام المطرقة فقط.

الإعداد الحالي: لقد قمت بإنشاء كائن استعلام ، وأرسلته إلى مستودع ، وتغذيت كل خيار إلى "دالة قيمة جدول SQL" حيث تمثل القيم الفارغة "الحصول على جميع المنتجات".

أنا أعتبر هذا جهدًا جيدًا ، لكن بعيدًا عن DDD مقبول. أريد تجنب أي "برمجة" في SQL ، آمل أن أفعل كل شيء من خلال مستودع. سيكون موضع تقدير التعليقات على هذا الموضوع.

سؤال محدد:

كيف يمكنني إعادة كتابة هذا الاستعلام ك استعلام ديناميكي؟ رابط لشيء مثل 101 أمثلة LINQ سيكون رائعا ، ولكن مع نطاق الاستعلام الديناميكي. أرغب حقًا في الانتقال إلى هذه الطريقة في الحقل في عروض الأسعار "" التي أريد قائمة الخيارات وعدد المنتجات التي لديها هذا الخيار.

from   p in db.Products
group  p by p.ProductSize into g
select new Category { 
       PropertyType = g.Key,
       Count = g.Count() }

سيكون لكل خيار DDL "التحديد (21)" حيث (21) هو كمية المنتجات التي تحتوي على تلك السمة. عند تحديد خيار ما ، سيتم تحديث جميع DDLs المتبقية مع الخيارات والتهم المتبقية.

تحرير: ملاحظات إضافية:

.OrderBy("it.City") // "it" refers to the entire record
.GroupBy("City", "new(City)") // This produces a unique list of City
.Select("it.Count()") //This gives a list of counts... getting closer
.Select("key") // Selects a list of unique City
.Select("new (key, count() as string)") // +1 to me LOL.  key is a row of group
.GroupBy("new (City, Manufacturer)", "City") // New = list of fields to group by
.GroupBy("City", "new (Manufacturer, Size)") // Second parameter is a projection

Product
.Where("ProductType == @0", "Maps")
.GroupBy("new(City)", "new ( null as string)")// Projection not available later?
.Select("new (key.City, it.count() as string)")// GroupBy new makes key an object

Product
.Where("ProductType == @0", "Maps")
.GroupBy("new(City)", "new ( null as string)")// Projection not available later?
.Select("new (key.City, it as object)")// the it object is the result of GroupBy

var a = Product
        .Where("ProductType == @0", "Maps")
        .GroupBy("@0", "it", "City") // This fails to group Product at all
        .Select("new ( Key, it as Product )"); // "it" is property cast though

ما تعلمته حتى الآن هو Linqpad رائع ، ولكن لا يزال يبحث عن إجابة. في النهاية ، سوف يسود بحث عشوائي تمامًا مثل هذا. مضحك جداً.

يحرر:

كان لدى جون سكيت فكرة رائعة: يلقي ما أحتاجه IGrouping<string, Product>. شكرا لجون سكيت! بمجرد إلقاء الكائن ، يمكنك التعداد على المجموعات وتغذية النتائج في قائمة منفصلة.

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

المحلول

لست متأكدًا من كيفية القيام بذلك باستخدام بناء جملة الاستعلام (على النحو الوارد أعلاه) ، ولكن باستخدام بناء الجملة ، يمكننا استخدام تعبير

using System;
using System.Linq;
using System.Linq.Expressions;

namespace LinqResearch
{
    public class Program
    {
        [STAThread]
        static void Main()
        {
            string columnToGroupBy = "Size";

            // generate the dynamic Expression<Func<Product, string>>
            ParameterExpression p = Expression.Parameter(typeof(Product), "p");

            var selector = Expression.Lambda<Func<Product, string>>(
                Expression.Property(p, columnToGroupBy),
                p
            );

            using (LinqDataContext dataContext = new LinqDataContext())
            {
                /* using "selector" caluclated above which is automatically 
                compiled when the query runs */
                var results = dataContext
                    .Products
                    .GroupBy(selector)
                    .Select((group) => new { 
                        Key = group.Key, 
                        Count = group.Count()
                    });

                foreach(var result in results)
                    Console.WriteLine("{0}: {1}", result.Key, result.Count);
            }

            Console.ReadKey();
        }
    }
}

نصائح أخرى

إذا ألقيت نظرة على C# بت, ، يناقش المؤلف كيفية إنشاء مرشحات متتالية باستخدام البيانات الديناميكية. لا يبدو أنك تستخدم بيانات ديناميكية ، لكن لديه منشئ تعبير لطيف قد يكون مفيدًا لك. انظر BuildQueryBody ، ثم القسم التالي من أساليب التمديد على iqueryable.

نظرًا لأنك لا تستخدم البيانات الديناميكية ، فستحتاج إلى التعامل مع عدم الوصول إلى كائن "MetaForeIngkeKeLumn" ، لكنني أظن أن نهجه قد يساعدك في سؤالك.

آمل أن يساعد هذا.

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