Linq查询在选择整个表时返回空参数

本文关键字:返回 参数 查询 选择 Linq | 更新日期: 2023-09-27 18:00:40

我对Linq很陌生,但最近一直在使用它,并且越来越有信心。我正在使用EF通过MVC项目中的上下文访问我的数据库。

在这个例子中,我想做的就是从我的一个表中获取所有数据。

var msgs = context.Messages.ToList();

我觉得这很好,但是当我稍后使用列表时:

foreach(Message m in msgs)
{
     var info = context.Contacts.Where(x => x.Id == m.recipient.Id)
                                .Select(x => x.MobileNumber).FirstOrDefault();
}

Message对象有一个强制性的Recipient,它是Contact对象(我的数据库中的另一个实体)。

我在上面的行中得到了一个NullArgumentException,因为消息对象的Recipient参数在我的列表中为null,尽管它们在数据库中不是null。

奇怪的是,这个列表的大小是正确的,所以它进入了foreach循环。该列表被正确选择,但根据我的调试器,所有属性都为null。

对此感到困惑,我运行了以下线路:

console.WriteLine(context.Messages.Select(x => x.Recipient.FirstName).FirstOrDefault());

并且第一消息的接收方的名字被写入控制台fine。因此,当我单独选择时,我可以检索邮件的收件人及其所有信息,但当试图检索整个表并将其存储在列表中时,收件人对象为空。

就像我所说的,我是从我的MVC项目之外访问它的,它包含上下文。我正在从另一个项目中使用它。然而,另一个项目同时引用了我的MVC项目(包含数据库的Message模型)和另一个包含不同类Message的项目。这种模糊性会是问题的根源吗?还是我所做的事情有其他问题?

编辑我显然对我的问题产生了一些困惑。问题是,一旦我检索到列表,列表的大小就正确了,但列表中消息对象的参数为null。例如,如果我写:

foreach (Message m in msgs)
        {
            Console.WriteLine("List Element Exists");
            if (m.Recipient != null)
            {
                Console.WriteLine(m.Recipient.FirstName);
            }
        }

我得到输出:

List Element Exists List Element Exists List Element Exists List Element Exists

对于列表中的每个元素。

JK

Linq查询在选择整个表时返回空参数

在linq查询中,where条件的结果很可能为null。

var info = context.Contacts.Where(x => x.Id == m.recipient.Id)
                                .Select(x => x.MobileNumber).FirstOrDefault()

此外,查询本身也有一些问题,您可以将相同的查询写成:

var mobileNumber = string.Empty; //if it is not a string then initialize with proper value
var info = context.Contacts.FirstOrDefault(x => x.Id == m.recipient.Id);
if(info != null)
    mobileNumber = info.MobileNumber;

还有另一个问题;如果你执行这一行:

var msgs = context.Messages.ToList();

它将从DB中获取所有CCD_ 5;但你只需要一个电话号码。因此,不需要获取所有记录,只需执行我提供的查询,而不调用foreach。

编辑

当执行ToList()时,立即执行数据库查询;这意味着CCD_ 8对象的CCD_。根据您使用的是Lazy Loading还是Eager Loading,您需要另一种机制来获取Recipient属性。类似于;

var msgs = context.Messages.Include(b => b.Recipients).ToList();

如果您期望得到消息。接收方包含某些内容(即在数据库中编译数据),这是一个映射问题。最常见的问题是Recipient属性未标记为虚拟。

编辑
或者,最糟糕的情况是,类被标记为密封的,但这通常不会发生