LINQ与Guid List的任何比较抛出错误

时间:2018-07-23 09:40:27

标签: linq .net-core

我正在研究LINQ查询,其中我选择了所有针对角色的声明。该角色可能有也可能没有声明,因此我没有进行任何操作,如下面的object ClaimList中所示。现在,我需要根据我是否尝试使用的某个角色是否存在声明来为状态对象分配true或false,但它会引发错误

错误

 cannot convert from system.Guid to system.Func<system.Guid, bool>

LINQ

var o2 = (from role in Context.Roles.Where(x=>x.Id == Guid.Parse("22000010-0002-4ADD-BC6F-7556616t66656"))
                  join roleClaimRef in Context.RoleClaims on role.Id equals roleClaimRef.RoleId into rc
                  select new
                  {
                     role,
                     roleClaim = rc.DefaultIfEmpty(),
                     claimList = (from claim in Context.Claims
                                  select new
                                  {
                                      claim,
                                      status = rc.Select(x=>x.ClaimId).Any(claim.Id) // throw error here....
                                  })
                  }).ToList();

3 个答案:

答案 0 :(得分:1)

您的问题是由于在linq中使用Guid.Parse,因此您必须创建一个变量并将其分配,然后再使用如下所示的变量:

Guid tmpId = Guid.Parse("22000010-0002-4ADD-BC6F-7556616t66656");
var o2 = (from role in Context.Roles.Where(x=>x.Id == tmpId)
              join roleClaimRef in Context.RoleClaims on role.Id equals roleClaimRef.RoleId into rc
              select new
              {
                 role,
                 roleClaim = rc.DefaultIfEmpty(),
                 claimList = (from claim in Context.Claims
                              select new
                              {
                                  claim,
                                  status = rc.Select(x=>x.ClaimId).Any(claim.Id)
                              })
              }).ToList();

答案 1 :(得分:1)

你在哪里说

status = rc.Select(x=>x.ClaimId).Any(claim.Id),您要将Guid作为参数传递给Linq函数Any,这需要返回布尔值(See documentation from the Microsoft Docs)的函数。

我假设您打算从rc属性等于您的ClaimId的{​​{1}}中进行选择。

在这种情况下,请执行以下操作:

  

claim.Id

希望这会有所帮助。

答案 2 :(得分:1)

使用ID条件检查您的where

   var o2 = (from role in Context.Roles.Where(x=>x.Id == Guid.Parse("22000010-0002-4ADD-BC6F-7556616t66656"))
                      join roleClaimRef in Context.RoleClaims on role.Id equals roleClaimRef.RoleId into rc
                      select new
                      {
                         role,
                         roleClaim = rc.DefaultIfEmpty(),
                         claimList = (from claim in Context.Claims
                                      select new
                                      {
                                          claim,
                                          status = rc.Where(a=>a.ClaimId==claim.Id).Select(x=>x.ClaimId)//check if claim id exist or not
                                      })
                      }).ToList();