【发布时间】:2018-07-19 22:24:41
【问题描述】:
这纯粹是为了提高我的技能。我的解决方案适用于主要任务,但它并不“整洁”。我目前正在开发一个带有实体框架项目的 .NET MVC。我只知道多年来已经足够的基本奇异 LINQ 函数。现在我想学习如何幻想。
所以我有两个模型
public class Server
{
[Key]
public int Id { get; set; }
public string InstanceCode { get; set; }
public string ServerName { get; set; }
}
public class Users
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public int ServerId { get; set; } //foreign key relationship
}
在我的一个视图模型中,我被要求提供一个下拉列表,用于在创建新用户时选择服务器。以 IEnumerable 形式填充文本和值 Id 的下拉列表 这是我的服务器下拉列表的原始属性
public IEnumerable<SelectListItem> ServerItems
{
get { Servers.ToList().Select(s => new selectListItem { Value = x.Id.ToString(), Text = $"{s.InstanceCode}@{s.ServerName}" }); }
}
更新要求,现在我需要显示与每个服务器选择相关的用户数。好的,没问题。这是我从头顶写下的内容。
public IEnumerable<SelectListItem> ServerItems
{
get
{
var items = new List<SelectListItem>();
Servers.ToList().ForEach(x => {
var count = Users.ToList().Where(t => t.ServerId == x.Id).Count();
items.Add(new SelectListItem { Value = x.Id.ToString(), Text = $"{x.InstanceCode}@{x.ServerName} ({count} users on)" });
});
return items;
}
}
这得到我的结果,可以说“localhost@rvrmt1u(8 个用户)”,但就是这样.. 如果我想按用户数对这个下拉列表进行排序怎么办。我所做的只是字符串中的另一个变量。
TLDR ...我确信某处的某个人可以教我一两件事,将其转换为 LINQ 查询并使其看起来更好。还知道如何对列表进行排序以首先显示用户最多的服务器。
【问题讨论】:
-
var items = Servers.Select(x => { var count = Users.Where(t => t.ServerId == x.Id).Count(); return new SelectListItem { Value = x.Id.ToString(), Text = $"{x.InstanceCode}@{x.ServerName} ({count} users on)" }); }).ToList();可能会让您走上正轨。 -
你确定你想要
ToList调用之前Where吗?您可能希望它在 SQL 端运行,而不是将整个表下载到内存中,然后对其进行过滤。您可能应该完全删除ToList,它只会让事情变慢而没有任何好处。 -
我希望你能意识到你是多么幸运能得到像下面埃里克这样的回应......
-
@BradleyUffner 你是对的,实际上它是如何写的。我匆忙写下我的问题。感谢您指出这一点。
标签: c# .net asp.net-mvc entity-framework linq