2010-10-04 6 views
2

J'ai 3 tables:multiple gauche Rejoignez LINQ-à-entités

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

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

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

Ainsi, la relation montre que nous avons des concessionnaires qui ont de multiples endroits (exemple: mauvaises herbes Chevrolet PA, Chevrolet Weed de NJ), puis chaque emplacement a ses propres contacts (exemple: les gestionnaires de l'emplacement de l'AP, les gestionnaires de l'emplacement NJ). Je dois rejoindre les 3 tables ensemble. Voilà ce que j'ai:

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 
       } 

Lorsque je tente de lier résultats à un BindingSource, puis à un DataGridView je reçois l'erreur suivante:

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

Que peut-il être? Je suis nouveau à joindre des déclarations dans LINQ, donc je suis sûr que je fais quelque chose de mal.

EDIT: Il y a des données dans la base de données de sorte que les résultats ne doivent pas être nul, juste pour clarifier

+0

Je pense qu'il est votre adresse ou d'une ligne de contact - probablement une partie de celui-ci est annulable et ne peut pas fonctionner avec un signe '' +. Essayez ça ... – veljkoz

Répondre

12

Vous étiez proche, mais j'ai découvert que vous devez convertir de LINQ-To-entités à LINQ-To-objets. D'abord, j'ai dû lancer les entités en utilisant AsEnumerable() puis utiliser ToList(). Cela a fait que je pouvais utiliser des fonctions comme ToString() et String.Format(). Merci de m'avoir conduit dans la bonne direction. Voici le code final:

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

Pas de problème, je suis content que ça a aidé. –

+0

ça m'a beaucoup aidé! – tiru

2

Depuis vos résultats est IQueryable, EF va essayer de jeter sur le côté du magasin de données et il ne fonctionnera pas car la conversion fonctionne uniquement avec les types scalaires. Vous devez appeler ToList() sur les résultats comme ceci:

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

Veuillez expliquer quelles corrections vous avez effectuées. –