当我尝试对DateTime进行排序时,为什么我的Linq查询会抛出异常?

时间:2011-12-03 14:09:36

标签: c# linq

我有这个方法用于按月过滤我的博客条目......

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是一个实体框架对象。说实话我有点困惑为什么我要查看blog.DateTime对象的值。即使我把它改为......

var blogsInMonth = from b in blogsOfType
                                   where ((DateTime)b.DateAdded).Month == DateTime.Now.AddMonths(-i).Month
                                   select b;

它仍然无法运作......希望有人可以提供帮助...

2 个答案:

答案 0 :(得分:1)

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

你可以尝试

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

答案 1 :(得分:1)

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

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

作为优化问题,您可以在Linq表达式之外计算“我回来”。如果有很多博客条目,您将不会执行DateTime.Now.AddMonth(-1)次多次。