为什么我的Linq查询抛出一个异常,当我尝试和排序的日期时间

本文关键字:时间 日期 排序 异常 一个 查询 Linq 我的 为什么 | 更新日期: 2023-09-27 18:16:53

我有一个按月过滤博客条目的方法…

public IList<KeyValuePair<string, int>> GetBlogsByMonth(PteDotNetCore.EnumsAndConstants.BlogType blogTypeArg)
        {
            var blogsOfType = from b in dataContext.blogs
                               where b.BlogType == (int)blogTypeArg
                               select b;

            IList<KeyValuePair<string, int>> retVal = new List<KeyValuePair<string, int>>();
            for(int i= 12; i > 1; i--)
            {
                var blogsInMonth = from b in blogsOfType
                                   where ((DateTime)b.DateAdded).Month == DateTime.Now.AddMonths(-i).Month
                                   select b;
                KeyValuePair<string, int> keyToAdd = new KeyValuePair<string, int>(DateTime.Now.AddMonths(-i).Month.ToString(), blogsInMonth.ToList().Count);
                retVal.Add(keyToAdd);
            }
            return retVal;
        }

当我使用调试器blogsInMonth我得到一个错误

base {System.SystemException} = {"Nullable object must have a value."}
Blog是一个实体框架对象。老实说,我有点困惑,为什么我必须看在博客的价值。DateTime对象。即使我把它改成…
var blogsInMonth = from b in blogsOfType
                                   where ((DateTime)b.DateAdded).Month == DateTime.Now.AddMonths(-i).Month
                                   select b;

它仍然不工作…

为什么我的Linq查询抛出一个异常,当我尝试和排序的日期时间

很可能Blog.DateAdded列在数据库中是可空的,并且列中存在空值。

你可以试试

where b.DateAdded != null && ((DateTime)b.DateAdded).Month == DateTime.Now.AddMonths(-i).Month

我认为这是因为你的b.DateAdded是空的。尝试更改顶部的行,如下所示:

var blogsOfType = from b in dataContext.blogs
    where b.DateAdded != null && b.BlogType == (int)blogTypeArg
    select b;

作为优化问题,您可以在Linq表达式之外计算"i moths back"。如果有很多博客条目,你不会做DateTime.Now.AddMonth(-1)超过必要的次数。