我有一个从数据库获取数据的方法,我希望返回一个对象。
但是,以下代码将返回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;
}
答案 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()调用,它可以返回多个对象。