Как выбрать максимальное количество и отображение даты - PullRequest
0 голосов
/ 28 мая 2020

У меня есть страница, на которой мне нужно отображать транзакции, срок действия которых истек, используя максимальную дату в таблице базы данных в качестве критерия, например: у меня есть следующие даты в моей таблице со статусом «Просрочено» в другом столбце

13/11/2020
19/05/2017
16/08/2003

Я выбираю все элементы с датой 13/11/2020 (максимальная дата) со статусом «Истекло» и отображаю количество всех записей, соответствующих на странице. Есть ли способ добиться этого с помощью orderbydescending или любого другого лямбда- или linq-выражения?

Ответы [ 2 ]

0 голосов
/ 28 мая 2020
 public class Transactions
 {
    public DateTime Date { get; set; }
    public string Status { get; set; }
 }
class Program
{
    static void Main(string[] args)
    {
        List<Transactions> transactions = new List<Transactions>
        {
            new Transactions {Date = Convert.ToDateTime("13/11/2020") , Status="Expired"},
            new Transactions {Date = Convert.ToDateTime("19/05/2017") , Status="Expired"},
            new Transactions {Date = Convert.ToDateTime("16/08/2003") , Status="Expired"},
            new Transactions {Date = Convert.ToDateTime("13/11/2020") , Status="Expired"},
            new Transactions {Date = Convert.ToDateTime("13/11/2020") , Status="Expired"},
            new Transactions {Date = Convert.ToDateTime("13/11/2020") , Status="Active"},

        };

        var expiredStatusTransactions = transactions.Where(x => x.Status == "Expired")
            .OrderByDescending(x => x.Date);
        if(expiredStatusTransactions.Any())
        {
            var expiredTransactionDetails = expiredStatusTransactions.Where(x => x.Date == expiredStatusTransactions.FirstOrDefault().Date);
            if(expiredTransactionDetails.Any())
            {
                foreach(var details in expiredTransactionDetails)
                {
                    Console.WriteLine($"Date : {details.Date.ToShortDateString()}     Status : {details.Status}");
                }

                Console.WriteLine($"Total Count : {expiredTransactionDetails.Count()}");
                Console.ReadLine();
            }
        }
    }
}
0 голосов
/ 28 мая 2020

В примере itemList - это список Item s, которые содержат ItemId типа int, ItemDate типа DateTime и ItemStatus типа string.

Этот код принимает просроченный элемент (ItemStatus == "Expired") с max date для каждого id (ItemId) и помещает эти элементы в список maxDateForEachExpiredItem .

itemList.GroupBy(item => item.ItemId).ToList()
    .ForEach(itemGroup => maxDateForEachExpiredItem.Add(
        itemGroup.ToList()
            .Where(itemGroupElement => itemGroupElement.ItemStatus == "Expired")
            .OrderByDescending(itemGroupElement => itemGroupElement.ItemDate)
            .FirstOrDefault()));

Чтобы получить количество таких элементов, где дата равна "13/11/2020"

maxDateForEachExpiredItem.Where(item => item.ItemDate == DateTime.Parse("11/13/2020")).Count()

Примечание в DateTime.Parse("11/13/2020") формат даты: месяц / день / год .

Пояснение:

1. itemList сгруппированы по ItemId. Эти группы элементов преобразуются в список для итерации по ним.

itemList.GroupBy(item => item.ItemId).ToList()

2. Итерация по каждому элементу (элементы, сгруппированные по ItemId) списка из части 1 и добавьте что-нибудь в список maxDateForEachExpiredItem.

.ForEach(itemGroup => maxDateForEachExpiredItem.Add(

3. Элементы, сгруппированные по ItemId, преобразуются в список для итерации по группе.

itemGroup.ToList()

4. Из группы элементов, сгруппированных по ItemId, возьмите элементы, где ItemStatus равно Expired.

.Where(itemGroupElement => itemGroupElement.ItemStatus == "Expired")

5. Закажите эти товары до ItemDate, начиная с самой новой даты.

.OrderByDescending(itemGroupElement => itemGroupElement.ItemDate)

6. Наконец, возьмите первый товар из такого упорядоченного списка.

.FirstOrDefault()));

Вот пример целиком.

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp10
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Item> itemList = new List<Item>
            {
                new Item(1, "01/05/2015", "Expired"),
                new Item(1, "01/06/2015", "Expired"),
                new Item(1, "01/12/2020", "Active"),
                new Item(2, "01/03/2015", "Expired"),
                new Item(2, "01/07/2019", "Expired"),
                new Item(2, "01/10/2020", "Active"),
                new Item(2, "13/11/2020", "Expired"),
                new Item(3, "16/08/2003", "Expired"),
                new Item(3, "19/05/2017", "Expired"),
                new Item(3, "13/11/2020", "Expired"),
                new Item(3, "31/12/2020", "Active")
            };

            List<Item> maxDateForEachExpiredItem = new List<Item>();

            itemList.GroupBy(item => item.ItemId).ToList()
                .ForEach(itemGroup => maxDateForEachExpiredItem.Add(
                itemGroup.ToList()
                        .Where(itemGroupElement => itemGroupElement.ItemStatus == "Expired")
                        .OrderByDescending(itemGroupElement => itemGroupElement.ItemDate)
                        .FirstOrDefault()));

            Console.WriteLine("Max date for each expired item:\n");
            foreach (var item in maxDateForEachExpiredItem)
            {
                Console.WriteLine(item);
            }

            Console.WriteLine("\nNumber of items where date is 13/11/2020: " +
            $"{maxDateForEachExpiredItem.Where(item => item.ItemDate == DateTime.Parse("11/13/2020")).Count()}");

            Console.ReadLine();
        }

        private class Item
        {
            public int ItemId { get; set; }
            public DateTime ItemDate { get; set; }
            public string ItemStatus { get; set; }

            public Item(int id, string date, string status)
            {
                ItemId = id;
                string[] dateParts = date.Split('/');
                ItemDate = new DateTime(int.Parse(dateParts[2]), int.Parse(dateParts[1]), int.Parse(dateParts[0]));
                ItemStatus = status;
            }

            public override string ToString()
            {
                return $"ItemId = {ItemId}, ItemDate = {ItemDate.ToString("dd/MM/yyyy")}, ItemStatus = {ItemStatus}";
            }
        }
    }
}

Результат

enter image description here

...