【问题标题】:Trying to understand LINQ [duplicate]试图理解 LINQ [重复]
【发布时间】:2016-01-28 19:08:40
【问题描述】:

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

但是下面的代码会返回 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;
    }

【问题讨论】:

  • 来自链接的副本:“最后,First() 和 Take() 的区别在于 First() 返回元素本身,而 Take() 返回仅包含一个元素的元素序列。 (如果您将 1 作为参数传递)。”
  • 旁注:预计问题的作者会进行一些基本调查(即阅读有关 C# 问题中使用的每种方法的 MSDN 文章),不这样做(或不展示结果)不会很好地反映作者,也可能引发对帖子本身的大量反对(即使帖子没有做错 - 他们无法自行修复)

标签: c# linq


【解决方案1】:

您的问题是因为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()

【讨论】:

  • 使用 FirstOrDefault(),而不是 First(),以避免可能的异常
【解决方案2】:

不要使用Take(1),而是使用First()FirstOrDefault()

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

【讨论】:

  • 那行得通,但为什么我不能使用 Take(1)?
  • 因为 Take(1) 不返回一个对象,它返回一个包含一个对象的列表。 (顺便说一句,我的意思是一般意义上的列表,而不是 List
  • @JDS 查看我的编辑。 Take() 是一种通用方法,无论您给出多长时间,它都会返回一个 IEnumerable。因此,返回计数为 1 的 IEnumerable 而不是第一个元素是一致的。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2018-01-13
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多