Asp.Net MVC 5 Суммируйте данные из нескольких таблиц - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь создать модель представления, которая суммирует информацию для каждой компании в моем приложении. К сожалению, я не могу получить результаты, которые мне нужны ... Я вижу примеры и другие вопросы, и они имеют смысл, но в тот момент, когда я должен написать свое собственное решение, все это просто разваливается.

В любом случае, в качестве примера я хотел бы подсчитать, сколько филиалов имеет каждая компания, или сколько мест базируется в компании. Обе они похожи, но они влияют на разные таблицы в моей схеме.

С точки зрения фактических табличных отношений, вот модели:

public class Branch
{

    [Key]
    public int BranchId { get; set; }

    [Required]
    [Display(Name = "Branch")]
    public string BranchName { get; set; }

    [Required]
    public int CompanyId { get; set; }

    [Required]
    public int LocationId { get; set; }

    public virtual Company Company { get; set; }

    public virtual Location Location { get; set; }
}

public class Location
{
    [Key]
    public int LocationId { get; set; }

    [Required]
    [Display(Name = "Location")]
    public string LocationName { get; set; }

    public ICollection<Branch> Branches { get; set; }
}

public class Company
{
    [Key]
    public int CompanyId { get; set; }

    [Display(Name = "Company")]
    [Required]
    public string CompanyName { get; set; }

    public ICollection<Branch> Branches { get; set; }
}

Код модели представления:

public class CompaniesRegisterViewModel
{
    public int CompanyId { get; set; }
    public string CompanyName { get; set; }
    public int BranchId { get; set; }
    public string BranchName { get; set; }
    public int BranchCount { get; set; }
    public int LocationId { get; set; }
    public string LocationName { get; set; }
    public int LocationCount { get; set; }

}

Мой текущий (неполный) код контроллера

    public ActionResult CompaniesRegisterViewModel()
    {
        var currentUser = User.Identity.GetUserId();

            var companyList = _db.Companies.ToList();

        var branchList = _db.Branches.Where(x => x.Company.CompanyId == );
        int count = 0;
        foreach (var branch in branchList)
            count++;
        var personVmList = companyList.Select(x =>
                new CompaniesRegisterViewModel
                {
                    CompanyName = x.CompanyName,
                    CompanyId = x.CompanyId,
                    BranchCount = count,
                    LocationCount = _db.Locations.Count(x => x.LocationId == )
                    //BranchId = x.BranchId,
                    //BranchName = x.Branch.BranchName
                }).ToList();

            return View(personVmList);
        //}

        //return View();
    }

Как видно выше, я пытаюсь каким-то образом получить и передать идентификатор компании в этом индексе списка. Я, должно быть, делаю это совершенно неправильно, потому что ничто из того, что я пробовал, пока не сработало.

from loc in Locations
join br in Branches on loc.LocationId equals br.LocationId
select loc.LocationName

Является ли приведенный выше запрос LINQ хорошим направлением?


ОБНОВЛЕНИЕ № 1

public ActionResult CompaniesRegisterViewModel()
    {
        var companyList = _db.Companies.ToList();
        var companyList1 = _db.Companies.GroupBy(x => x.CompanyId);

        //PersonInCompanyViewModel personInCompanyVM = new PersonInCompanyViewModel();

        var test = _db.Companies.GroupBy(info => info.CompanyId)
            .Select(group => new
            {
                CompanyId = group.Key,
                Count = group.Select(x => x.Branches).Count()
            }).OrderBy(x => x.CompanyId);

        var branches = _db.Branches.GroupBy(info => info.BranchId)
            .Select(group => new
            {
                BranchId = group.Key,
                Count = group.Count()
            }).OrderBy(x => x.BranchId);

        var test2 = branches.AsQueryable().Select(x =>
            new CompaniesRegisterViewModel
            {
                BranchCount = x.Count

            });

        var branchlist = _db.Branches.ToList();

        var branchCount =
            from p in companyList
            group p by p.Branches into g
            select new { Branch = g.Key, BranchCount = g.Count() };

        var personVmList = companyList.Select(x =>
                new CompaniesRegisterViewModel
                {
                    CompanyName = x.CompanyName,
                    CompanyId = x.CompanyId,
                    BranchCount = branchCount.Count()
                    //BranchCount = _db.Companies.GroupBy(b => b.CompanyId).Count(1, d => d.Branches.Count)
                    //LocationCount = companyList1.Count()
                    //BranchId = x.BranchId,
                    //BranchName = x.Branch.BranchName
                }).ToList();

            return View(personVmList);
        //}

        //return View();
    }

1 Ответ

0 голосов
/ 03 ноября 2018

Если кто-то наткнется на этот вопрос, вот ответ, который мне нужен.

var model = _db.Branches.GroupBy(x => new { ID = x.CompanyId, Name = x.Company.CompanyName }).Select(y => new CompaniesRegisterViewModel { CompanyId = y.Key.ID, CompanyName = y.Key.Name, BranchCount = y.Count() });

Спасибо @Stephen Muecke!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...