首页 > 解决方案 > 如何根据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; }
}

这很好用,但我需要以更好的方式来做,而不是从头开始创建关系或使查询更好。

标签: c#entity-frameworklinqrelationship

解决方案


您的模型包含项目每一端到产品一对多关系的导航属性。

这允许您从项目开始查询,应用过滤器,然后使用集合导航属性“导航”向下,并且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>();

推荐阅读