2010-10-04 73 views
2

我有3个表:多左加入LINQ到实体

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

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

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

所以关系表明,我们有谁拥有多个位置的经销商(如:PA的杂草雪佛兰,NJ的杂草雪佛兰),然后每个地点都有自己的联系人(例如: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. 

什么可以吗?我是LINQ中JOIN语句的新手,所以我确信我做错了什么。

编辑:有是数据库中的数据,因此结果不为空,只是为了澄清

+0

我觉得这是你的地址或联络线 - 也许有一些是可空的,不能用'+'标志进行操作。试试看... – veljkoz 2010-10-04 23:00:05

回答

12

你是接近,但我发现,你必须把它从LINQ到实体到LINQ到对象转换:你应该在结果这样调用ToList()。首先,我必须使用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

没问题,我很高兴它有帮助。 – 2010-10-05 16:29:44

+0

它帮了我很多! – tiru 2012-01-18 08:12:40

2

因为你的结果是IQueryable,EF将尝试投射在数据存储方面,它不会工作因为投射仅适用于标量类型。

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

请解释你做了哪些更正。 – 2015-09-15 07:06:08