简单的linq问题,但我无法弄清楚

时间:2014-11-11 13:12:59

标签: c# .net linq

我有一个简单的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]

但这永远不会改变或显示我希望它显示的内容。

我做错了什么?

5 个答案:

答案 0 :(得分:7)

您想要使用SingleSingleOrDefaultFirstFirstOrDefault,具体取决于您想要的内容,例如:

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

  • 如果您使用SingleOrDefault,则会在多个结果或没有结果的情况下返回null

  • 另一方面,
  • First仅对空集合失败 - 当有多个元素时,它将返回第一个元素。

  • 最宽容的FirstOrDefault会返回null表示空结果列表,第一个元素会返回。{/ p>

答案 1 :(得分:2)

您必须记住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();

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

t是一个可以返回许多项的IEnumerable。如果您只想使用其中一项,则需要致电t.First()t.Single(),例如:

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

两种方法的区别在于,如果结果中有多个项目,Single将抛出异常,而First只会在没有匹配结果的情况下抛出。

如果您想检查结果是否确实存在,可以使用FirstOrDefaultSingleOrDefault,例如:

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

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

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

答案 4 :(得分:0)

问题是tIEnumerableToString只会为您提供该类型的名称。您需要将枚举转换为逗号分隔列表

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 。如果枚举为空,则SingleFirstLast将抛出异常,如果枚举具有多个值,则Single将抛出异常。只需为您的用例选择合适的一个。