我已经搜索了其他问题,但他们似乎没有遇到过这个问题。
这是我遇到问题的代码行:
tenderName = _vfpTenderTypes.Where(x => x.ID == tenderCode)
.Select(x => x.Name).ToString().Trim();
我有一个对象列表(_vfpTenderTypes
),每个对象都有一些属性(在这种情况下为ID
& Name
)。我想检索对象ID
与提供的数字(tenderCode
)匹配的对象的名称。
运行代码时tenderName
会填充以下文本而不是对象名称:
System.Linq.Enumerable + WhereSelectListIterator`2 [Models.TenderType,System.String]
答案 0 :(得分:3)
根据您的需要尝试以下其中一项:
tenderName = _vfpTenderTypes.Where(x => x.ID == tenderCode).Select(x => x.Name.Trim());
或者这个:
tenderName = _vfpTenderTypes.FirstOrDefault(x => x.ID == tenderCode).Name.Trim();;
答案 1 :(得分:3)
从Linq查询的末尾删除ToString()
:
tenderName = _vfpTenderTypes.Where(x => x.ID == tenderCode)
.Select(x => x.Name.Trim());
<强> 此外: 强>
如果每个Single
只有一个项目,您可以使用SingleOrDefault
或Id
方法:
tenderName = _vfpTenderTypes.Where(x => x.ID == tenderCode)
.Select(x => x.Name.Trim())
.Single();
另外,不要忘记检查&#34; Linq中的延迟执行&#34;了解Linq如何运作。
<强> 说明: 强>
此输出的原因是,您正在为将从ToString()
方法返回的对象调用Select()
方法,在这种情况下为WhereSelectListIterator
。
public override IEnumerable<TResult> Select<TResult>(Func<TSource, TResult> selector) {
return new WhereSelectEnumerableIterator<TSource, TResult>(source, predicate, selector);
}
并且WhereSelectListIterator
没有ToString
方法的任何实现。默认情况下,ToString()
方法返回对象实例类型的字符串表示形式:
public virtual String ToString()
{
return GetType().ToString();
}
System.Linq.Enumerable + WhereSelectListIterator`2 [Models.TenderType,System.String]
答案 2 :(得分:3)
.Select类似于SQL select,你得到一个结果列表而不是一个字符串。 一旦调用.toString(),您将获得默认的Enumerable toString(),而不仅仅是您想要的结果。 您可以尝试使用First或Single(如果它是唯一的)
tenderName = _vfpTenderTypes.First(x => x.ID == tenderCode).Name
答案 3 :(得分:2)
因为它们可以被链接,所以LINQ查询通常返回IEnumerable<TResult>
,以从初始集合中获取单个结果
您必须使用First
/ FirstOrDefault
,Single
/ SingleOrDefault
等方法:
var tenderName = _vfpTenderTypes.Where(x => x.ID == tenderCode)
.Select(x => x.Name.Trim()).SingleOrDefault();
或者:
var tenderName = _vfpTenderTypes.SingleOrDefault(x => x.ID == tenderCode)
.Name.Trim();