c# - 如何根据ID从另一个表中获取一个表数据
问题描述
我创建了 3 个表关系(用户、项目、产品)
一个用户有很多项目,一个项目有很多产品(一对多)
我需要在用户登录时显示所有项目和包含的产品
我已经使用以下代码完成了它,但我认为这不是处理它的最佳方法。我需要做得更好
public ActionResult Index()
{
ModulesViewModel mvm = new ModulesViewModel();
List<Modules> modules = new List<Modules>();
var userId = User.Identity.GetUserId();
var projects = _adsDbContext.Project.Where(x=>x.UserID == userId).ToList();
foreach (var pro in projects)
{
var productData = _adsDbContext.Product.Where(x => x.ProjectID == pro.ProjectID);
modules.AddRange(productData);
}
modules = modules.OrderBy(x => x.ProjectID).OrderBy(x=>x.ModuleNumber).ToList();
mvm.Modules = modules;
return View(mvm);
}
public class Project
{
public int ProjectID { get; set; }
public string Name { get; set; }
public virtual ICollection<ProductData> Products { get; set; }
public string UserID { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
}
public class ProductData : Modules
{
public int ProductDataID { get; set; }
public float ConversionRate { get; set; }
public float Price { get; set; }
public float TotalSales { get; set; }
public float GrossSales { get; set; }
public float NetProfit { get; set; }
public float ProfitPerLead { get; set; }
}
public abstract class Modules
{
public int ProjectID { get; set; }
public virtual Project Project { get; set; }
}
这很好用,但我需要以更好的方式来做,而不是从头开始创建关系或使查询更好。
解决方案
您的模型包含项目每一端到产品一对多关系的导航属性。
这允许您从项目开始查询,应用过滤器,然后使用集合导航属性“导航”向下,并且SelectMany
:
var modules = _adsDbContext.Project
.Where(x => x.UserID == userId)
.SelectMany(x => x.Products) // <--
.OrderBy(x => x.ProjectID).ThenBy(x => x.ModuleNumber)
.ToList<Modules>();
或者您可以从产品开始查询并使用参考导航属性“导航”以应用过滤器:
var modules = _adsDbContext.Product
.Where(x => x.Project.UserID == userId) // <--
.OrderBy(x => x.ProjectID).ThenBy(x => x.ModuleNumber)
.ToList<Modules>();
推荐阅读
- sql-server - PowerShell-复制项无法将参数绑定到参数“路径”,因为它为空
- windows-subsystem-for-linux - 在使用 vscode-remote 之前,每次 Windows 启动后都需要重新启动 wsl
- email - NetSuite SuiteScript 2.0 - 将文件对象附加到通过 SuiteScript 发送的电子邮件
- python - 如何创建具有特定名称的文本文件并访问它们
- c - 循环只取第一个数组值
- date - 如何将时间戳日期列转换为首选格式 dd/MM/yyyy?
- python - 如何从序列化程序中获取用户?
- python - 在文件行中搜索相同的字符串
- linux - 无法在 RHEL8 上安装 yum downloadonly 插件
- kubernetes - 指定了 startupProbe 和 initialDelaySeconds 的 K8S Pod 等待太长时间才变为就绪