Как получить данные одной таблицы на основе идентификатора из другой таблицы - PullRequest
1 голос
/ 12 мая 2019

Я создал 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; }
}

Это работает нормально, но мне нужно сделать это лучше, а не создавать отношения с нуля или сделать запрос лучше.

1 Ответ

2 голосов
/ 12 мая 2019

Ваша модель содержит свойство навигации для каждого конца проекта для отношения один ко многим продукта.

Это позволяет запустить запрос из проекта, применить фильтр и затем "перейти" вниз, используясвойство навигации коллекции и 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>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...