简单的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]
但这永远不会改变,也不会显示出我想要它显示的东西。
我做错了什么?
您想要使用Single
或SingleOrDefault
或First
或FirstOrDefault
,具体取决于您想要什么,例如:
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
仅在没有匹配结果的情况下才会抛出异常。
如果你想检查结果是否真的存在,你可以使用FirstOrDefault
或SingleOrDefault
,例如:
var id=t.FirstOrDefault();
if (id!=null)
ViewBag.thisID = id.ToString();
如果将条件作为谓词传递给First
、FirstDefault
等,则可以压缩调用:
var id=cIDtext.FirstOrDefault(ctext=> ctext.cid.ToString() == MembID);
问题是t
是IEnumerable
,而ToString
只会为您提供类型的名称。你需要把你的枚举变成一个逗号分隔的列表
ViewBag.thisID = string.Join(",", t.Select(v => v.ToString()));
或者更有可能您只想要一个值,并且需要使用First
或Single
。
ViewBag.thisID = t.First().ToString();
或
ViewBag.thisID = t.Single().ToString();
如果有多个返回值并且您只想要第一个,则使用First
;如果您想要最后一个,则可以使用Last
。如果查询只返回一个值,则应使用Single
。还有FirstOrDefault
、LastOrDefault
和SingleOrDefault
,如果枚举为空,或者在Single
的情况下,如果枚举有多个值,它们将返回默认值。如果枚举为空,或者在Single
的情况下,如果枚举有多个值,则Single
、First
和Last
将抛出异常。只需为您的用例选择合适的一个即可。