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()
    };