Cri*_*lin 2 c# linq-to-entities left-join
我有3张桌子:
Dealerships
------------
ID, Name, Website
Locations
------------
ID, DealershipID, Address, Ect.
Contacts
------------
ID, LocationID, Name, Ect.
Run Code Online (Sandbox Code Playgroud)
因此,这种关系表明我们拥有多个地点的经销商(例如:PA的Weed Chevrolet,新泽西州的Weed Chevrolet),然后每个地点都有自己的联系人(例如: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
}
Run Code Online (Sandbox Code Playgroud)
当我尝试将结果绑定到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.
Run Code Online (Sandbox Code Playgroud)
它能是什么?我是LINQ中JOIN语句的新手,所以我确信我做错了.
编辑:数据库中有数据,因此结果不应为空,只是为了澄清
Cri*_*lin 12
你很接近,但我发现你必须将它从LINQ-To-Entities转换为LINQ-To-Objects.首先,我必须使用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;
Run Code Online (Sandbox Code Playgroud)