代码之家  ›  专栏  ›  技术社区  ›  tsilb

Linq到SQL:与匿名类型不同

  •  1
  • tsilb  · 技术社区  · 17 年前

    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对象只返回一行。

    this answer ,但情况似乎有所不同。另外,如果我只选择act.Session.IP,Distinct()也可以正常工作,但它有一个我希望避免检索的列,我不希望通过手动绑定我的datagrid列来实现这一点。

    2 回复  |  直到 9 年前
        1
  •  3
  •   eglasius    17 年前
    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()
        };
    

    或:

    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()
        };
    
        2
  •  0
  •   John Saunders    17 年前

    Enumerable.Distinct的重载之一接受IEqualityComparer实例。只需编写一个实现IEqualityComparer的类,该类只比较两个地址属性。

    不幸的是,您必须为正在使用的匿名类命名。