it-swarm.dev

كيفية فرض LINQ Sum () أثناء مجموعة المصدر فارغة

عندما أقوم بإجراء الاستعلام التالي ، إذا لم تتم مطابقة خيوط ، يلقي الاستعلام التالي استثناءً. في هذه الحالة ، أفضل أن يكون المجموع يساوي 0 بدلاً من استثناء يتم طرحه. هل سيكون هذا ممكنًا في الاستعلام نفسه - أقصد بدلاً من تخزين الاستعلام والتحقق من query.Any()؟

double earnings = db.Leads.Where(l => l.Date.Day == date.Day
                && l.Date.Month == date.Month
                && l.Date.Year == date.Year
                && l.Property.Type == ProtectedPropertyType.Password
                && l.Property.PropertyId == PropertyId).Sum(l => l.Amount);
159
John Mayer

حاول تغيير استعلامك إلى هذا:

db.Leads.Where(l => l.Date.Day == date.Day
            && l.Date.Month == date.Month
            && l.Date.Year == date.Year
            && l.Property.Type == ProtectedPropertyType.Password
            && l.Property.PropertyId == PropertyId)
         .Select(l => l.Amount)
         .DefaultIfEmpty(0)
         .Sum();

بهذه الطريقة ، سيحدد الاستعلام الخاص بك الحقل Amount فقط. إذا كانت المجموعة فارغة ، فسوف تُرجع عنصرًا واحدًا بقيمة 0 وبعد ذلك سيتم تطبيق المبلغ.

342
Simon Belanger

انا افضل استخدام اختراق آخر:

double earnings = db.Leads.Where(l => l.Date.Day == date.Day
                                      && l.Date.Month == date.Month
                                      && l.Date.Year == date.Year
                                      && l.Property.Type == ProtectedPropertyType.Password
                                      && l.Property.PropertyId == PropertyId)
                          .Sum(l => (double?) l.Amount) ?? 0;
157
tukaef

جرب هذا بدلاً من ذلك ، إنه أقصر:

db.Leads.Where(..).Aggregate(0, (i, lead) => i + lead.Amount);
5
Kovács Róbert

هذا هو الفوز بالنسبة لي:

int Total = 0;
Total = (int)Db.Logins.Where(L => L.id == item.MyId).Sum(L => (int?)L.NumberOfLogins ?? 0);

في جدول تسجيل الدخول الخاص بي ، في الحقل NUMBEROFLOGINS ، تكون بعض القيم فارغة (NULL) والبعض الآخر لديه رقم INT. ألخص هنا إجمالي NUMBEROFLOGINS لجميع مستخدمي شركة واحدة (كل معرف).

2
Pedro Ramos
db.Leads.Where(l => l.Date.Day == date.Day
        && l.Date.Month == date.Month
        && l.Date.Year == date.Year
        && l.Property.Type == ProtectedPropertyType.Password
        && l.Property.PropertyId == PropertyId)
     .Select(l => l.Amount)
     .ToList()
     .Sum();
0
Mona

تحديث: على الرغم من أن الحل يعمل ، هذه الإجابة غير صحيحة . من الواضح أن الصحيح هو الذي قدمه سيمون Belanger. ومع ذلك ، بدلاً من الحذف ، أتركها هنا كمعلومات تكميلية (انظر التعليقات).

التفاصيل المهمة هنا هي أن تطبيق LINQ إلى SQL لـ Sum(هذا واحد كنت تستخدمه بوضوح) يختلف عن LINQ إلى كائن واحد. إجابة Simon Belanger صحيحة وأحبها ، ولكن (وليس للبحث بعيدًا) هناك خيار آخر لجعل هذا العمل هو تغيير نوع التحويل البرمجي لمصدر واستخدام LINQ To Objects. سيتم تنفيذ Sum المختلف (بدون أي عمليات إضافية مطلوبة):

db.Leads.Where(...)
        .AsEnumerable() // switch to LINQ to Objects
        .Sum(l => l.Amount);

من MSDN :

أسلوب AsEnumerable (IEnumerable) له تأثير غير تغيير نوع وقت الترجمة من مصدر يقوم بتنفيذ IEnumerable إلى IEnumerable نفسه.

0
jwaliszko