我有 3 个表:
Dealerships
------------
ID, Name, Website
Locations
------------
ID, DealershipID, Address, Ect.
Contacts
------------
ID, LocationID, Name, Ect.
因此,该关系显示我们的经销商有多个地点(例如:宾夕法尼亚州的 Weed Chevrolet、新泽西州的 Weed Chevrolet),然后每个地点都有自己的联系人(例如:PA 地点的经理、新泽西州地点的经理)。我需要将 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
}
当我尝试将 results 绑定(bind)到 BindingSource,然后再绑定(bind)到 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 语句的新手,所以我确定我做错了什么。
编辑:数据库中有数据所以结果不应该为空,只是为了澄清
最佳答案
你很接近,但我发现你必须将它从 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;
关于c# - 多个左连接 LINQ-to-entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3859173/