简单的linq问题,但我可以';我想不通

本文关键字:想不通 我可以 linq 问题 简单 | 更新日期: 2023-09-27 18:29:58

我有一个简单的LINQ问题。我试图查询一个列表,将成员ID与列表ID进行匹配,然后返回一些文本:

var IDtext = IDMethod(MembID);
var t = from ctext in cIDtext 
        where ctext.cid.ToString() == MembID 
        select cxt.C_ID;
ViewBag.thisID = t.ToString();

所有这些回报都是:

System.Linq.Enumerable+WhereSelectArrayIterator`2[pu15.Models.C_ID,System.Int32]

但这永远不会改变,也不会显示出我想要它显示的东西。

我做错了什么?

简单的linq问题,但我可以';我想不通

您想要使用SingleSingleOrDefaultFirstFirstOrDefault,具体取决于您想要什么,例如:

ViewBag.thisID = t.Single();
  • 如果有多个结果或没有结果,Single将抛出异常。

  • 如果使用SingleOrDefault,则在出现多个结果或没有结果的情况下,它将返回null

  • 另一方面,First只会在空集合中失败——当有多个元素时,它会返回第一个元素。

  • 最宽容的FirstOrDefault将为空结果列表返回null,如果有多个结果列表,则返回第一个元素。

您必须记住,where子句返回的是IEnumerable<T>,而不仅仅是一个值。您必须获取该集合的第一个或特定元素并显示它,或者如果它是对象的集合,则显示该元素的属性。

在您的情况下,这将是:

var IDtext = IDMethod(MembID);
var allIDs = from ctext in cIDtext 
        where ctext.cid.ToString() == MembID 
        select cxt.C_ID;
var single = allIDs.SingleOrDefault();
//or:
var first = allIDs.FirstOrDefault();
ViewBag.thisID = single.ToString();
//or
ViewBag.thisID = first.ToString();

您可以使用方法语法,跳过Where子句,只使用First()

ViewBag.thisID = cIDtext
                  .First(c => c.cid.ToString() == MembID)
                  .C_ID.ToString(); 

t是一个IEnumerable,它可能返回许多项。如果你只想使用其中一个项目,你需要调用t.First()t.Single(),例如:

 ViewBag.thisID = t.First().ToString();

这两种方法的区别在于,如果结果中有1个以上的项,Single将抛出异常,而First仅在没有匹配结果的情况下才会抛出异常。

如果你想检查结果是否真的存在,你可以使用FirstOrDefaultSingleOrDefault,例如:

 var id=t.FirstOrDefault();
 if (id!=null)
     ViewBag.thisID = id.ToString();

如果将条件作为谓词传递给FirstFirstDefault等,则可以压缩调用:

var id=cIDtext.FirstOrDefault(ctext=> ctext.cid.ToString() == MembID);

问题是tIEnumerable,而ToString只会为您提供类型的名称。你需要把你的枚举变成一个逗号分隔的列表

ViewBag.thisID = string.Join(",", t.Select(v => v.ToString()));

或者更有可能您只想要一个值,并且需要使用FirstSingle

ViewBag.thisID = t.First().ToString();

ViewBag.thisID = t.Single().ToString();

如果有多个返回值并且您只想要第一个,则使用First;如果您想要最后一个,则可以使用Last。如果查询只返回一个值,则应使用Single。还有FirstOrDefaultLastOrDefaultSingleOrDefault,如果枚举为空,或者在Single的情况下,如果枚举有多个值,它们将返回默认值。如果枚举为空,或者在Single的情况下,如果枚举有多个值,则SingleFirstLast将抛出异常。只需为您的用例选择合适的一个即可。