Проблемы с преобразованием запроса SQL Lite в запрос модели с помощью Entity Framework - PullRequest
0 голосов
/ 26 мая 2020

У меня есть таблица базы данных с серией уведомлений. Для одного города, xgrid и ygrid может быть несколько уведомлений. Итак, я получаю последнюю дату и использую эту запись с помощью запроса SQL Lite.

Прочитав несколько статей на этом сайте, я попытался собрать воедино запрос модели, эквивалентный запросу SQL Lite ниже.

Проблема в том, что запрос модели не содержит ошибок компиляции, но результаты равны нулю.

SQL Lite Query

select * from (
    select
        NOTIFY_ID,
        NOTIFICATION_DATE,
        CITY_NAME,
        ITEM_X_GRID,
        ITEM_Y_GRID,
        GRID_QUANTITY,
        row_number() over(partition by ITEM_X_GRID, ITEM_Y_GRID, CITY_NAME order by NOTIFICATION_DATE desc) as rn
    from
        USER_ILLY_DATA
) t
where t.rn = 1
order by CITY_NAME

Class & List

        public class MostRecentNotify
        {
            public int RecordID { get; set; }
            public string ItemXGrid { get; set; }
            public string ItemYGrid { get; set; }
            public string GridQuantity { get; set; }
            public string NotificationDate { get; set; }
            public string CityName { get; set; }
            public string IllyItemCode { get; set; }
        }

        public IList<MostRecentNotify> RecentNotifies { get; set; }

Запрос модели для получения последней записи (не работает)

var tempResults = _context.IllyAPIData.GroupBy(i => new { i.ItemXGrid, i.ItemYGrid, i.CityName})
                .Select(g => g.OrderByDescending(y => y.NotificationDate).FirstOrDefault());

Запрос модели для передачи значений в класс для вызова в Razor Pages

            var RecentNotifies = tempResults.Select(r => new MostRecentNotify//).ToListAsync();
                                        {
                                            ItemXGrid = r.ItemXGrid,
                                            ItemYGrid = r.ItemYGrid,
                                            GridQuantity = r.GridQuantity,
                                            NotificationDate = r.NotificationDate,
                                            CityName = r.CityName,
                                            IllyItemCode = r.IllyriadCode,
                                            RecordID = r.RecordID,
                                        }).ToListAsync();

Фрагмент Razor Pages

@foreach (var item in Model.RecentNotifies.Where(i => i.CityName == city.DistinctCityName)){
    @foreach (var indRes in Model.RareResources.Where(r => r.ResourceCode == item.IllyItemCode)){

Ошибка при загрузке страницы

ArgumentNullException: Value cannot be null. (Parameter 'source')
System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
System.Linq.Enumerable.Where<TSource>(IEnumerable<TSource> source, Func<TSource, bool> predicate)
IllyriadAssist.Pages.harvestableInventory.Pages_harvestableInventory_Index.ExecuteAsync() in Index.cshtml
+ @foreach (var item in Model.RecentNotifies.Where(i => i.CityName == city.DistinctCityName)){
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)
Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, bool invokeViewStarts)

1 Ответ

0 голосов
/ 27 мая 2020

После того, как я еще немного ковырялся, я смог заставить запросы работать, сделав это следующим образом:

            var tempData = from c in _context.IllyAPIData
                           group c by new { c.CityName, c.ItemXGrid, c.ItemYGrid } into g
                           select new
                           {
                               g.Key.CityName,
                               g.Key.ItemXGrid,
                               g.Key.ItemYGrid,
                               NotifyDate = g.Max(a => a.NotificationDate)
                           };
            var RecentNotifies = (from c in _context.IllyAPIData
                                  join s in tempData
                                     on new { c.CityName, c.ItemXGrid, c.ItemYGrid }
                                         equals new { s.CityName, s.ItemXGrid, s.ItemYGrid }
                                  where c.NotificationDate == s.NotifyDate
                                  select c).ToListAsync();
...