Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# 使用Linq从IEnumerable访问嵌套数据<;索赔>;_C#_.net_Linq_Claims - Fatal编程技术网

C# 使用Linq从IEnumerable访问嵌套数据<;索赔>;

C# 使用Linq从IEnumerable访问嵌套数据<;索赔>;,c#,.net,linq,claims,C#,.net,Linq,Claims,从.NET应用程序中的IEnumerable对象访问深度嵌套的值时遇到一些问题 我在这里通读了十几个类似的问题,但它们都使用了某种Json对象,而且据我所知,IEnumerable无法像一个一样访问,也无法轻松解析为一个 以下是ClaimsPrinciple中的值在调试器中的外观示例: {exp: 1234567} {iat: 7654321} {_claims_names: {"groups":"src1"}} {_claims_sources: {"src1":{"endpoint":"ht

从.NET应用程序中的
IEnumerable
对象访问深度嵌套的值时遇到一些问题

我在这里通读了十几个类似的问题,但它们都使用了某种Json对象,而且据我所知,
IEnumerable
无法像一个一样访问,也无法轻松解析为一个

以下是ClaimsPrinciple中的值在调试器中的外观示例:

{exp: 1234567}
{iat: 7654321}
{_claims_names: {"groups":"src1"}}
{_claims_sources: {"src1":{"endpoint":"http://graph.windows.net..."}}}
{ipaddr: 1.1.2.2}
{http://schemas.microsoft.com/claims/authnmethodsreferences: rsa}
{http://schemas.microsoft.com/claims/authnmethodsreferences: mfa}
根据我的研究,声明通常被认为是简单的键/值对,不建议使用嵌套数据。但我没有创建自定义索赔类型;这正是我从身份验证服务中得到的

如果声明或声明集只是常规的键/对值,我可以从列表中轻松访问它们。例如,如果我需要一个帐户上的所有活动身份验证方法,我可以这样做,并且它工作得非常完美:

var authMethodsRes = claims.Where(c => c.Type == "http://schemas.microsoft.com/claims/authnmethodsreferences");
var authMethodsCodes = authMethodsRes.Select(c => c.Value).ToList();
但我还需要访问嵌套在其他值(如
)中的值http://graph.windows.net...“
URL在上面的示例中。我怎么去?我是否需要使用
一次挖掘一个级别。选择
并返回到
IEnumerable

我试着这样做:

var claimExtract = claims.Where(c => c.Type == "_claims_sources");
claimExtract = (IEnumerable<Claim>)claimExtract.Select(c => c.Value);
claimExtract = (IEnumerable<Claim>)claimExtract.Select(c => c.Value);
valueExtract = claimExtract.Select(c => c.Value).ToString();
var claimExtract=claims.Where(c=>c.Type==“\u claims\u sources”);
claimExtract=(IEnumerable)claimExtract.Select(c=>c.Value);
claimExtract=(IEnumerable)claimExtract.Select(c=>c.Value);
valueExtract=claimExtract.Select(c=>c.Value.ToString();

但是
claims.Where(c=>c.Type==“\u claims\u sources”)所以我真的很困惑如何继续。

也许内部的模式不同于
http://schemas.microsoft.com/claims/authnmethodsreferences
?我很难弄清楚这个问题在问什么。你有一系列的声明,所以让我们先澄清一下:你是在尝试对每个声明做一些操作,比如“我有一系列声明,我想要一系列名称”,还是在尝试对整个序列做一些操作,比如“我有一系列声明,我想知道序列中有多少”?或者您正在尝试对序列中可能存在或可能不存在的特定声明执行操作?@EricLippert我正在尝试访问嵌套在具有多个内部密钥/对值的声明中的值。比如我的例子第4行的“…”值。为(希望)清晰起见,请编辑OP。尝试从SelectMany开始,展平每个嵌套序列,然后过滤结果。您事先知道您要查找的序列嵌套的深度吗?