试图理解 LINQ [重复]

Posted

技术标签:

【中文标题】试图理解 LINQ [重复]【英文标题】:Trying to understand LINQ [duplicate] 【发布时间】: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 文章),不这样做(或不展示结果)不会很好地反映作者,也可能引发对帖子本身的大量反对(即使帖子没有做错 - 他们无法自行修复) 【参考方案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() 调用,它们可以返回多个对象。

【讨论】:

以上是关于试图理解 LINQ [重复]的主要内容,如果未能解决你的问题,请参考以下文章

试图理解 Mathf.Approximately [重复]

试图理解 async 和 await [重复]

获取api,为啥我必须在响应json()上使用then,试图理解承诺[重复]

我试图更好地理解 `this` 的用法。这个例子很冗长,但它的目的是为了更好地理解[重复]

c# linq groupby是默认去掉重复行吗

使用LINQ去除重复项。