试图理解 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)
返回计数 n
的 IEnumerable
(在您的情况下,计数 1 的 IEnumerable
)而 First()
返回 IEnumerable
中的第一个对象。
【讨论】:
那行得通,但为什么我不能使用 Take(1)? 因为 Take(1) 不返回一个对象,它返回一个包含一个对象的列表。 (顺便说一句,我的意思是一般意义上的列表,而不是 ListTake()
是一种通用方法,无论您给出多长时间,它都会返回一个 IEnumerable
。因此,返回计数为 1 的 IEnumerable
而不是第一个元素是一致的。【参考方案3】:
您是否尝试过使用 FirstOrDefault() 而不是 Take(1)?这应该允许您指定您只期望一个结果。 我相信您遇到数据类型问题的原因是 ToList() 和 Take() 调用,它们可以返回多个对象。
【讨论】:
以上是关于试图理解 LINQ [重复]的主要内容,如果未能解决你的问题,请参考以下文章
获取api,为啥我必须在响应json()上使用then,试图理解承诺[重复]