无法从对象列表中检索属性

时间:2016-01-06 12:10:25

标签: c# linq

我已经搜索了其他问题,但他们似乎没有遇到过这个问题。

这是我遇到问题的代码行:

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]

4 个答案:

答案 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只有一个项目,您可以使用SingleOrDefaultId方法:

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 / FirstOrDefaultSingle / 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();