2010-10-04 2 views
2

У меня есть 3 таблицы:Multiple левый Присоединяйтесь LINQ к лицам

Dealerships 
------------ 
ID, Name, Website 

Locations 
------------ 
ID, DealershipID, Address, Ect. 

Contacts 
------------ 
ID, LocationID, Name, Ect. 

Таким образом, соотношение показывает, что у нас есть дилерские, которые имеют несколько мест (например: Weed Chevrolet ПА, Weed Шевроле Нью-Джерси), а затем каждое место имеет свои собственные контакты (пример: Менеджеры местоположения PA, Менеджеры местоположения NJ). Мне нужно присоединиться к 3 таблицам вместе. Это то, что у меня есть:

var results = from d in entities.dealerships 
       join l in entities.locations on d.ID equals l.DealershipID 
       join c in entities.contacts on l.ID equals c.LocationID 
       select new 
       { 
        Name = d.Name, 
        Website = d.Website, 
        Address = l.Address + ", " + l.City + ", " + l.State + " " + l.Zip, 
        Contact = c.FirstName + " " + c.LastName, 
        WorkPhone = c.WorkPhone, 
        CellPhone = c.CellPhone, 
        HomePhone = c.HomePhone, 
        Email = c.Email, 
        AltEmail = c.AltEmail, 
        Sells = l.Sells 
       } 

При попытке связать результаты в виде BindingSource, а затем в DataGridView я получаю следующее сообщение об ошибке:

Unable to cast the type 'System.Nullable`1' to type 'System.Object'. 
LINQ to Entities only supports casting Entity Data Model primitive types. 

Что это может быть? Я новичок в операторах JOIN в LINQ, поэтому я уверен, что делаю что-то неправильно.

EDIT: Существуют данные в базе данных, так что результаты не должны быть пустыми, просто для уточнения

+0

Я думаю, что это ваш адрес или контактный линия - вероятно, некоторые из них обнуляемые и не могут работать с '' знак +. Попробуйте это ... – veljkoz

ответ

12

Вы были близки, но я обнаружил, что вы должны преобразовать его из LINQ-to-Entities в LINQ-To-объектов. Сначала мне пришлось отбрасывать объекты, используя AsEnumerable(), а затем использовать ToList(). Это сделало так, что я мог использовать такие функции, как ToString() и String.Format(). Спасибо, что вел меня в правильном направлении. Вот окончательный код:

var query = from d in entities.dealerships 
      from l in entities.locations.Where(loc => loc.DealershipID == d.ID).DefaultIfEmpty() 
      from c in entities.contacts.Where(cont => cont.LocationID == l.ID).DefaultIfEmpty() 
      where d.Keywords.Contains(keywords) || l.Keywords.Contains(keywords) || l.Sells.Contains(keywords) || c.Keywords.Contains(keywords) 
      select new 
      { 
       Dealership = d, 
       Location = l, 
       Contact = c 
      }; 

var results = (from r in query.AsEnumerable() 
       select new 
       { 
        Name = r.Dealership.Name, 
        Website = r.Dealership.Website, 
        Contact = r.Contact.FirstName + " " + r.Contact.LastName, 
        Address = r.Location.Address + ", " + r.Location.City + ", " + r.Location.State + " " + r.Location.Zip, 
        WorkPhone = r.Contact.WorkPhone, 
        CellPhone = r.Contact.CellPhone, 
        Fax = r.Contact.Fax, 
        Email = r.Contact.Email, 
        AltEmail = r.Contact.AltEmail, 
        Sells = r.Location.Sells 
       }).ToList(); 

bindingSource.DataSource = results; 
+0

Без проблем, я рад, что это помогло. –

+0

Это помогло мне много! – tiru

2

Поскольку ваши результаты являются IQueryable, EF попытается бросить на стороне хранилища данных, и он не будет работать потому что cast работает только со скалярными типами. Вы должны вызвать ToList() на результаты так:

var results = (from d in entities.dealerships 
       join l in entities.locations on d.ID equals l.DealershipID 
       join c in entities.contacts on l.ID equals c.LocationID 
       select new 
       { 
        Name = d.Name, 
        Website = d.Website, 
        Address = l.Address + ", " + l.City + ", " + l.State + " " + l.Zip, 
        Contact = c.FirstName + " " + c.LastName, 
        WorkPhone = c.WorkPhone, 
        CellPhone = c.CellPhone, 
        HomePhone = c.HomePhone, 
        Email = c.Email, 
        AltEmail = c.AltEmail, 
        Sells = l.Sells 
       }).ToList(); 
0
var EmplistDriver = (from a in data 
        join b in db.DesignationDetails on a.DesignationID equals b.DesignationDetailID into EmployeeBonus 
        from b in dataBonus.DefaultIfEmpty() 

        join x in db.EmployeeCommission on a.EmployeeDetailID equals x.EmployeeDetailID into EmployeeCommission 
        from x in dataComm.DefaultIfEmpty() 

        join c in db.EmployeeAdvance on a.EmployeeDetailID equals c.FKEAEmployeeID 

        join d in db.EmployeeAllowance on a.EmployeeAllowanceID equals d.EmployeeAllowanceID 
        join e in dataAtt on a.EmployeeDetailID equals e.EmployeeDetailID 

        join f in dataDri on a.EmployeeDetailID equals f.EmployeeDetailID 
        join h in db.ProjectAllocation on f.FKAllocationID equals h.PKAllocationID 

        join i in db.ProjectDetails on h.FKProjectDetailID equals i.ProjectDetailID 


        where a.IsActive == true && c.EAIsActive == true && d.IsActive == true && e.EAIsActive == true && h.IsActivity == true 

        select new 
        { 
         c.BalanceAmount, 
         c.BalanceDue, 
         d.FoodAllowance, 
         i.DriverBasicSalary, 
         d.OtherAllowance, 
         d.AccommodationAllowance, 
         e.EABasicWorktime, 
         BonusAmount = (b.BonusAmount == null ? 0 : b.BonusAmount), 
         CommissionAmount = (x.CommissionAmount == null ? 0 : x.CommissionAmount), 
         TotalOverTime, 
         TotalHr 

        }).FirstOrDefault(); 
+1

Пожалуйста, объясните, какие исправления вы сделали. –

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