【发布时间】:2020-04-15 08:43:18
【问题描述】:
所以我有一个测试博客的以下 linq 查询:
var random = new Random();
var random = context.Blog.OrderBy(x => random.Next())
.Where(x => x.DisplayStatus == "Approved")
.Select(x => new Blog
{
Title = x.Title,
Content = x.Content,
AuthorId = x.AuthorId,
Author = x.Authors.AuthorName //null pointer exception here
}).Take(5).ToList()
问题是,当它命中“x.Authors.AuthorName”时会抛出空指针异常。我不知道为什么。我知道作者在那里,因为当我使用 linq 表达式(来自 context.Blog 中的 x 等)时它工作正常,并且它在 LinqPad 中工作。不过,我不能使用 linq 表达式,因为我不知道如何在不使用 lambda 表达式的情况下声明“OrderBy(x => random.Next())”。
这是没有随机的版本
var working = (from x in context.Blog
//NO known code to select random
where x.DisplayStatus == "Approved"
select new Blog
{
Title = x.Title,
Content = x.Content,
AuthorId = x.AuthorId,
Author = x.Authors.AuthorName //NO null pointer exception
}).Take(5).ToList()
Blog 是一个没有数据库关系的 POCO 类。 Authors 是一个数据库实体类, AuthorName 是一个简单的字符串。 知道这里发生了什么吗?
【问题讨论】:
-
x.DisplayStaus中的错字证明它不是您声称有效的复制/粘贴代码。 “每个人都在撒谎” (c) 豪斯博士。所以我们忽略了这个说法。当你获得 NRE 时,x和x.Authors有什么价值? -
您可以尝试将第二个变量的名称更改为与分配给 new Random() 的第一个变量不同的名称吗?
-
我不想实际复制粘贴我的代码,因为完整的 linq 查询相当长。我整理了一个更简洁地描述问题的示例。如果这让您感到困扰,我会修复它。
-
这能回答你的问题吗? Linq to Entities, random order