博观而约取,厚积而薄发。这篇文章主要讲述返回ApplicationUser对象或ApplicationUserId字符串的列表相关的知识,希望能为你提供帮助。
我的ASP.NET核心项目中有一个Twitter风格的粉丝/后续设置。
我正在尝试构建一个LINQ查询,它将返回属于我的记录以及我所关注的用户网络。像这样的东西:
.Where(o =>
usersFollowingList.Contains(o.ApplicationUser.Id))
我的粉丝/后续设置是与.NET Core的IdentityUser的自引用关系:
public class ApplicationUser : IdentityUser
{
public virtual ICollection<
Network>
Following { get;
set;
}
public virtual ICollection<
Network>
Followers { get;
set;
}
}public class Network
{
public ApplicationUser ApplicationUser { get;
set;
}
public string ApplicationUserId { get;
set;
}
public ApplicationUser Follower { get;
set;
}
public string FollowerId { get;
set;
}
}
此设置为我提供了我所关注的用户列表。该集合具有ApplicationUser对象及其ApplicationUserId,它是字符串类型。
我试图获取我可以在上面的WHERE子句中使用的ApplicationUser对象或ApplicationUserId字符串的集合遇到问题。
【返回ApplicationUser对象或ApplicationUserId字符串的列表】我可以得到一个我的粉丝的ApplicationUserId字符串列表,如下所示:
var g = from p in loggedinUser.Following
select p.ApplicationUser.Id.ToString();
但是这不包含我自己的ApplicationUserId。我无法轻松地将自己的ApplicationUserId添加到此集合中,因为它是IEnumerable类型。
如何获取可以在WHERE子句中使用的ApplicationUser对象或ApplicationUserId字符串的适当集合?或者有没有更好的方法来使用我的WHERE过滤器中的追随者列表?
答案你可以使用
Concat
添加两个IEnumerable
,所以你只需要将自己转换为单身IEnumerable
。我更喜欢扩展方法:public static IEnumerable<
T>
Append<
T>
(this IEnumerable<
T>
rest, params T[] last) =>
rest.Concat(last);
现在您可以查询为:
var g = (from p in loggedinUser.Following
select p.ApplicationUser.Id.ToString())
.Append(loggedinUser.Id.ToString());
但如果你已经拥有
g
Where
物体,为什么在Following
使用Network
?var g = loggedinUser.Following
.Append(loggedinUser);
当然,你也可以做
Where
,但这是不必要的搜索:.Where(o =>
usersFollowingList.Contains(o.ApplicationUser.Id) || o.ApplicationUser.Id == loggedinUser.Id)
推荐阅读
- 使用Automapper优化相关子查询
- Spring @RequestMapping注释到不同的位置
- 使用Azure App Service Logging时是否需要blob StorageExceptions()
- 从密钥保险库将证书上载到App Service
- 禁用Azure App Services上的某些W3C日志记录字段
- 如何获取Azure App Service的特定用户分配的托管服务标识的令牌()
- 具有真实电话号码的Firebase PhoneAuth不工作但白名单号正在运行 - Android
- Firebase的新Firestore DB对电子商务Android应用程序来说更贵吗()
- 通过bash脚本获取Android Studio项目的构建文件夹路径