关于c#:试图了解LINQ

Trying to understand LINQ

本问题已经有最佳答案,请猛点这里访问。

我有一个从数据库中获取数据的方法,我想返回一个单独的对象。

但是,以下代码将返回空值。

我已经核实了进来的数据包含1条记录。

如果我将返回类型从一个对象更改为一个对象列表,这个方法就可以工作。

我想知道为什么在这种情况下,为什么我不能只返回一个对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
    public PersonObj GetPersonInformation(string personName)
    {
        DataTable dt = _oracle.GetPersonInformation(personName);
        var aPerson = dt.AsEnumerable().Select(x =>
                    new PersonObj
                    {
                        FirstName = x.Field<string>("FIRST_NAME"),
                        LastName = x.Field<string>("LAST_NAME"),
                        PhoneNumber = x.Field<string>("PHONE_NUMBER")
                    }).ToList().Take(1);

        return aPerson as PersonObj;
    }


你的问题是因为Take返回一个IEnumerable。这是因为您可以指定要提取的金额。例如,如果你这样做,会发生什么?

1
2
3
4
5
6
7
8
9
10
11
12
    public PersonObj GetPersonInformation(string personName, int take)
        {
            DataTable dt = _oracle.GetPersonInformation(personName);
            return dt.AsEnumerable().Select(x =>
                        new PersonObj
                        {
                            FirstName = x.Field<string>("FIRST_NAME"),
                            LastName = x.Field<string>("LAST_NAME"),
                            PhoneNumber = x.Field<string>("PHONE_NUMBER")
                        }).ToList().Take(take);

        }

你可以要求(并得到)一个,但你可以要求更多。这说明了出现错误的原因:Take(1)返回的IEnumerable带有1个元素,而不是单个元素本身。

如果你只想要第一个,你可以打电话给First()


是否尝试使用FirstOrDefault()而不是Take(1)?这应该允许您指定只期望一个结果。我相信您对数据类型有问题的原因是tolist()和take()调用,它可以返回多个对象。


First()FirstOrDefault()代替Take(1)

Take(n)返回n计数的IEnumerable(在您的情况下,是1计数的IEnumerable),而First()返回IEnumerable中的第一个对象。