2016-10-17 6 views
0

Я пытаюсь вернуть единственную запись из множественного объединения LINQ в MVC, я использую модель из моей базы данных персонала, которая имеет основную таблицу с именем персонала, некоторые поля являются только идентификатором и зависят от других таблиц. Поэтому мне нужен способ присоединиться к этим таблицам, чтобы получить все данные, отфильтровать их по идентификатору Параметр и поместить результат LINQ в модель представления и вернуть его для просмотра. Это мой Database Model, я использовал следующий код, но он не работает.Вернуть одиночную запись из multi join с LINQ в форме viewmodel в MVC

public ActionResult Details(int id) 
    { 
     var q = from personnel in db.Personels 
       join Genders in db.Genders on personnel.GenderId equals Genders.Id 
       join nationality in db.Nationalities on personnel.NationalityId equals nationality.Id 
       join religion in db.Religions on personnel.ReligionId equals religion.Id 
       join course in db.Courses on personnel.CourseId equals course.Id 
       join accBank in db.AccBanks on personnel.AccBankId equals accBank.Id 
       join advanceStatus in db.AdvanceStatus on personnel.AdvanceStatusId equals advanceStatus.Id 
       join chart in db.Charts on personnel.ChartId equals chart.Id 
       join contract in db.Contracts on personnel.ContractId equals contract.Id 
       join costCenter in db.CostCenters on personnel.CostCenterId equals costCenter.Id 
       join job in db.Jobs on personnel.JobId equals job.Id 
       join level in db.Levels on personnel.LevelId equals level.Id 
       join military in db.Militaries on personnel.MilitaryId equals military.Id 
       join subReligion in db.SubReligions on personnel.SubReligionId equals subReligion.Id 
       join taxTable in db.TaxTables on personnel.TaxTableId equals taxTable.Id 
       join unit in db.Units on personnel.UnitId equals unit.Id 
       join workHouse in db.WorkHouses on personnel.WorkHouseId equals workHouse.Id 
       join licence in db.Licences on personnel.LicenceId equals licence.Id 
       join payPlace in db.PayPlaces on personnel.PayPlaceId equals payPlace.Id 
       join married in db.MarriedStatus on personnel.MarriedId equals married.Id 
       join jobStatus in db.JobStatus on personnel.JobStatusId equals jobStatus.Id 
       where (personnel.Id == id) 
       select new PersonnelViewModel() 
       { 
        PersonelNo = personnel.PersonelNo, 
        PersonelFName = personnel.PersonelFName, 
        PersonelLName = personnel.PersonelLName, 
        FatherName = personnel.FatherName, 
        NId = personnel.NId, 
        RecognizeNo = personnel.RecognizeNo, 
        BirthDate = personnel.BirthDate, 
        BirthPlace = personnel.BirthPlace, 
        RecordCity = personnel.RecordCity, 
        WorkHouse = workHouse.Name, 
        CostCenter = costCenter.Name, 
        Course = course.Name, 
        Nationality = nationality.Title, 
        Licence = licence.Title, 
        Religion = religion.Title, 
        SubReligion = subReligion.Title, 
        Military = military.Title, 
        Level = level.Title, 
        Chart = chart.Name, 
        Job = job.Name, 
        PayPlace = payPlace.Title, 
        Unit = unit.Name, 
        Contract = contract.Title, 
        Gender = Genders.Title, 
        MarriedStatus = married.Title, 
        ChildQty = personnel.ChildQty, 
        InsNo = personnel.InsNo, 
        Address = personnel.Address, 
        PhoneNumber = personnel.PhoneNumber, 
        MobileNumber = personnel.MobileNumber, 
        Status = personnel.Status, 
        ProcessStatus = personnel.ProcessStatus, 
        JobStatus = jobStatus.title, 
        TaxPerFree = personnel.TaxPerFree, 
        TaxPriceFree = personnel.TaxPriceFree, 
        StartWorkDate = personnel.StartWorkDate, 
        StartRuleDate = personnel.StartRuleDate, 
        EndRuleDate = personnel.EndRuleDate, 
        StopWorkDate = personnel.StopWorkDate, 
        TimeYearlyPrice = personnel.TimeYearlyPrice, 
        DateYearlyPrice = personnel.DateYearlyPrice, 
        TaxMonth = personnel.TaxMonth, 
        AccBankNo = personnel.AccBankNo, 
        AccBank = accBank.Title, 
        SumTimeWork = personnel.SumTimeWork, 
        SumTaxPrice = personnel.SumTaxPrice, 
        SumPay = personnel.SumPay, 
        PrepareStatus = personnel.PrepareStatus, 
        TotalStandWork = personnel.TotalStandWork, 
        InsPerFree = personnel.InsPerFree, 
        InsPriceFree = personnel.InsPriceFree, 
        SumPerWork = personnel.SumPerWork, 
        SumPerWorkTemp = personnel.SumPerWorkTemp, 
        AccCode = personnel.AccCode, 
        PrnFish = personnel.PrnFish 
       }; 
     return View(q); 
    } 

Есть ли способ?

+0

Просто поставьте свое утверждение в скобках и выполните '.FirstOrDefault()' – uTeisT

+0

Запрос, возвращающий коллекцию. Вам нужно добавить '.FirstOrDefault()' в конец этого '... PrnFish = staff.PrnFish}). FirstOrDefault();' (и вам не хватало закрытия ')' –

+0

Спасибо, что добавил '.FirstOrDefault () ', но он не возвращает ничего без ошибки –

ответ

0

У вас есть два варианта. Вы можете использовать метод Single(). Это проверит всю коллекцию для одного экземпляра, который соответствует предикату, который вы можете предоставить, или вы можете использовать SingleOrDefault(). Если в коллекции нет экземпляра, удовлетворяющего требованиям предикатов, тогда вместо него будет возвращено значение по умолчанию.

Методы Single() и SingleOrDefault() генерируют исключение, если найдено более одной записи, которая соответствует требованию предиката. Если это так, то вы можете использовать метод First() или метод FirstOrDefault(). Эти методы, как правило, выполняются быстрее, а также потому, что, как только экземпляр найден в вашей коллекции, дальнейшая работа не выполняется, чтобы проверить, существует ли еще какой-либо экземпляр.

 Смежные вопросы

  • Нет связанных вопросов^_^