Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda表达式以获取3个字段值_C#_Asp.net_Linq - Fatal编程技术网

C# Lambda表达式以获取3个字段值

C# Lambda表达式以获取3个字段值,c#,asp.net,linq,C#,Asp.net,Linq,我想从列表中的一行中检索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

我想从列表中的一行中检索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加入


感谢您的帮助和时间

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


另外,要认识到第一个是一个渴望加载的构造(强制加载),而Select是一个惰性的计算。如果您的上下文在迭代发生之前超出范围,则可能会得到一个空的结果集。如果将对象上下文包装在Using块中,并且实际的数据绑定迭代发生在Using块的范围之外,则通常会发生这种情况。您可能需要在组合查询的末尾添加.ToList(),以强制加载。

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

你可以试试这样的方法:

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

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

您需要强制计算,例如

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

我设法解决了这个问题,这是我的错。首先,我在语句末尾执行了.First(),然后我必须调用name.FOS1和name.FOS2以及name.FOS3。此外,resultset将始终包含1行,因为之前在代码中已经对其进行了筛选,以获得SortedResult。谢谢你的帮助

您是否可以添加显示如何读取“name”类型的代码,即如何检查/查看FOS1、FOS2和FOS3成员是否为空?另外,您确实注意到,最初您只使用res.tID=tID的多个结果中的第一个,而在第二个结果中,您可能会得到一组结果?我会尝试选择I而不是它的三个变量,然后写出name.PrimaryKey和name.FOS1、name.FOS2和name.FOS3,看看这是怎么回事。似乎不需要在那里定义新对象。同意Christian.K,
name
将是匿名类型的
IEnumerable
。不仅仅是第一排。我们看到的代码看起来是正确的。大家好,我已经设法解决了它,这是我的错。首先,我在语句末尾执行了.First(),然后我必须调用name.FOS1和name.FOS2以及name.FOS3。此外,resultset将始终包含1行,因为之前在代码中已经对其进行了筛选,以获得SortedResult。谢谢你的帮助!作为旁白;我会避免在生产代码中使用
Convert.ToInt32
,因为这可能会隐藏bug。您可能需要强制转换或解析,但很少在运行时动态选择两者;而
Convert
在面对
null
(但不是
DBNull
)时的行为令人惊讶。