Linq to SQL: DISTINCT с анонимными типами - PullRequest
1 голос
/ 12 апреля 2009

Учитывая этот код:

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 (), он оценивает всю строку как отличную и, следовательно, не может найти дубликаты. Я хочу вернуть ровно одну строку для каждого объекта act.Session.IP.

Я уже нашел этот ответ , но, похоже, ситуация другая. Кроме того, Distinct () работает нормально, если я просто выбираю act.Session.IP, но у него есть столбец, который я хочу избежать, и я бы предпочел не делать этого вручную, связывая столбцы моей таблицы данных.

Ответы [ 2 ]

3 голосов
/ 12 апреля 2009
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()
    };
0 голосов
/ 12 апреля 2009

Одна из перегрузок Enumerable.Distinct принимает экземпляр IEqualityComparer. Просто напишите класс, который реализует IEqualityComparer и который сравнивает только два свойства Address.

К сожалению, вам придется дать имя анонимному классу, который вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...