【发布时间】:2015-10-21 01:37:06
【问题描述】:
我有一个获取不同行的供应商联系人的 SQL 查询,它返回正确的行数:
SELECT DISTINCT v.VendorID, c.ContactID,
v.VendorName,
c.FirstName, c.MiddleName, c.LastName,
FROM VendorContacts vc
INNER JOIN Contact c
ON c.ContactID = vc.ContactID
INNER JOIN Vendor v
ON v.VendorID = vc.VendorID
LEFT JOIN [ContactServices] psvc
ON psvc.ContactID = c.ContactID
AND psvc.VendorID = v.VendorID
根据上面的查询,我有一个想要返回自定义类型的方法:
public List<ProviderContactInfo> GetProviderContactInfo(ProviderContactInfo searchInfo)
{
using (var db = new MyContext())
{
var providerContactInfo =
(from vc in db.VendorContacts
join ps in db.ContactServices on new { vc.ContactID, vc.VendorID } equals new { ps.ContactID, ps.VendorID } into ps_join
from ps in ps_join.DefaultIfEmpty()
join c in db.Contacts on vc.ContactID equals c.ContactID
join v in db.Vendors on vc.VendorID equals v.VendorID
orderby vc.ContactID descending
select new ProviderContactInfo()
{
VendorName = v.VendorName,
FirstName = c.FirstName,
MiddleName = c.MiddleName,
LastName = c.LastName,
Services = (from o in db.ContactServices
join cps in db.Contacts on o.ContactID equals cps.ContactID
join vps in db.Vendors on o.VendorID equals vps.VendorID
join s in db.Services on o.ServiceID equals s.ServiceID
where ps.ServiceID == o.ServiceID
&& o.ContactID == c.ContactID
&& o.VendorID == v.VendorID
select s).ToList()
}).Distinct().ToList();
return providerContactInfo;
}
}
我收到了错误:
附加信息:“Distinct”操作不能应用于 指定参数的集合 ResultType。
当我从新的 ProviderContactInfo 中删除 Services 属性时,一切正常,所以我确定这是我尝试填充该属性(类型为 List<Service>)的方式
我知道有很多关于 Linq with Distinct 等的问题,但我找不到关于这个特定问题的任何信息。
请帮忙!
编辑此代码有效:
public List<ProviderContactInfo> GetProviderContactInfo(ProviderContactInfo searchInfo)
{
using (var db = new MyContext())
{
var providerContactInfo =
(from vc in db.VendorContacts
join c in db.Contacts on vc.ContactID equals c.ContactID
join v in db.Vendors on vc.VendorID equals v.VendorID
orderby vc.ContactID descending
select new ProviderContactInfo()
{
VendorName = v.VendorName,
FirstName = c.FirstName,
MiddleName = c.MiddleName,
LastName = c.LastName,
Services = (from o in db.ContactServices
join cps in db.Contacts on o.ContactID equals cps.ContactID
join vps in db.Vendors on o.VendorID equals vps.VendorID
join s in db.Services on o.ServiceID equals s.ServiceID
where o.ContactID == c.ContactID
&& o.VendorID == v.VendorID
select s).ToList()
}).Distinct().ToList();
return providerContactInfo;
}
}
【问题讨论】:
-
如果用 .ToList().Distinct() 而不是 .Distinct().ToList() 结束会发生什么?
-
错误 CS0266 无法将类型“System.Collections.Generic.IEnumerable
”隐式转换为“System.Collections.Generic.List ”。存在显式转换(您是否缺少演员表?) -
您是否尝试过为 ProviderContactInfo 创建自定义比较器并将其传递给 distinct 函数?参考stackoverflow.com/questions/31681929/…
标签: c# sql linq entity-framework-6