Lambda表达式获取3个字段值

本文关键字:字段 3个 获取 表达式 Lambda | 更新日期: 2023-09-27 18:06:27

我想从LIST<>一行中检索3个字段,目前我是这样做的

FOS1 = (from res in sortedSearchResults
where Convert.ToInt32(res.tID) == tID
select res.FOS1).First();
FOS2 = (from res in sortedSearchResults
where Convert.ToInt32(res.tID) == tID
select res.FOS2).First();
FOS3 = (from res in sortedSearchResults
where Convert.ToInt32(res.tID) == tID
select res.FOS3).First();

这工作得很好,但是我希望不是3个语句,我只有1个,但我不是很熟悉Lambda表达式。

我尝试了以下操作:-

var name = sortedSearchResults.Where(i => Convert.ToInt32(i.tID) == tID)
.Select(i => new { FOS1 = i.FOS1, FOS2 = i.FOS2, FOS3 = i.FOS3 });

,但FOS1, FOS2和FOS3总是空的,当它们应该有值。有人能告诉我我做错了什么,为什么我没有得到var填充?

感谢您的帮助和时间

Lambda表达式获取3个字段值

您选择的投影看起来正确。我注意到的唯一一件事是,在单独的语句中,您调用。first,您没有在组合查询中这样做。是否有可能在组合查询中返回比预期更多的记录,并且没有对它们进行迭代。

另外,要意识到First是一个急于加载的构造(强制加载),而Select是一个惰性求值。如果您的上下文在迭代发生之前超出了作用域,那么您可能会得到一个空的结果集。如果您将对象上下文包装在Using块中,并且实际的数据绑定迭代发生在Using块的作用域之外,则经常会发生这种情况。您可能需要在组合查询的末尾添加. tolist()来强制加载。

您需要强制求值,例如

var name = sortedSearchResults.Where(i => Convert.ToInt32(i.tID) == tID).Select(i => new {FOS1 = i.FOS1, FOS2 = i.FOS2, FOS3 = i.FOS3}).First();

据我所知,FOS1, FOS2和FOS3是您想要填充值的三个局部变量。

你可以试试这样做:

sortedSearchResults.First(i => Convert.ToInt32(i.tID) == tID)
.Each(i =>  
{ 
FOS1 = i.FOS1;
FOS2 = i.FOS2; 
FOS3 = i.FOS3; 
});

或者,您可以选择对象并根据其属性填充变量。

我已经设法解决了它,这是我的错。首先,我在语句末尾执行了。First(),然后我必须调用name。FOS1和名称。FOS2和名字,fos3。此外,结果集将始终包含1行,因为它已经在前面的代码中进行了过滤,以获得sortedResults。谢谢你的帮助!——