Linq to sql Linq到SQL:与匿名类型不同
鉴于此代码:Linq to sql Linq到SQL:与匿名类型不同,linq-to-sql,distinct,anonymous-types,Linq To Sql,Distinct,Anonymous Types,鉴于此代码: dgIPs.DataSource = from act in Master.dc.Activities where act.Session.UID == Master.u.ID select new { Address = act.Session.IP.Address, Domain = act.Session.IP.Domain, FirstAccess = act.Session.IP.FirstAccess
dgIPs.DataSource =
from act in Master.dc.Activities
where act.Session.UID == Master.u.ID
select new
{
Address = act.Session.IP.Address,
Domain = act.Session.IP.Domain,
FirstAccess = act.Session.IP.FirstAccess,
LastAccess = act.Session.IP.LastAccess,
IsSpider = act.Session.IP.isSpider,
NumberProblems = act.Session.IP.NumProblems,
NumberSessions = act.Session.IP.Sessions.Count()
};
如何仅基于Distinct地址提取Distinct()?也就是说,如果我简单地添加Distinct(),它会将整行计算为Distinct,因此无法找到任何重复项。我想为每个act.Session.IP对象只返回一行
我已经找到了,但情况似乎不同。另外,如果我只选择act.Session.IP,Distinct()也可以正常工作,但它有一个我希望避免检索的列,我不希望通过手动绑定我的datagrid列来实现这一点。Enumerable的重载之一。Distinct接受IEqualityComparer实例。只需编写一个实现IEqualityComparer的类,该类只比较两个地址属性 不幸的是,您必须为正在使用的匿名类命名
dgIPs.DataSource =
from act in Master.dc.Activities
where act.Session.UID == Master.u.ID
group act by act.Session.IP.Address into g
let ip = g.First().Session.IP
select new
{
Address = ip.Address,
Domain = ip.Domain,
FirstAccess = ip.FirstAccess,
LastAccess = ip.LastAccess,
IsSpider = ip.isSpider,
NumberProblems = ip.NumProblems,
NumberSessions = ip.Sessions.Count()
};
或:
如果我没记错的话,LINQtoSQL中不支持这种重载(因为它不能将IEqualityComparer传输到服务器),只支持LINQtoObject。因此,在调用Distinct()之前,海报还需要在结果集上调用ToList()。我尝试了这种方法,在分析结果时发现它生成了一些非常古怪的SQLBrehtt,同意。它似乎总是至少查询数据库两次。
dgIPs.DataSource =
from act in Master.dc.Activities
where act.Session.UID == Master.u.ID
group act.Session.IP by act.Session.IP.Address into g
let ip = g.First()
select new
{
Address = ip.Address,
Domain = ip.Domain,
FirstAccess = ip.FirstAccess,
LastAccess = ip.LastAccess,
IsSpider = ip.isSpider,
NumberProblems = ip.NumProblems,
NumberSessions = ip.Sessions.Count()
};