试图了解LINQ

时间:2016-01-28 19:08:41

标签: c# linq

我有一个从数据库获取数据的方法,我希望返回一个对象。

但是,以下代码将返回null。

我已经确认进来的dt包含1条记录。

如果我将返回类型从对象更改为对象列表,则此方法有效。

我想要理解为什么在这种情况下以及为什么我不能只返回一个对象。

    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;
    }

3 个答案:

答案 0 :(得分:2)

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

    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)返回包含1个元素的IEnumerable,而不是单个元素本身。

如果您只想要第一个,可以拨打First()

答案 1 :(得分:1)

取代Take(1),执行First()FirstOrDefault()

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

答案 2 :(得分:1)

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