Как я могу сопоставить свой LINQ to SQL сгруппированный результат с этим существующим интерфейсом? - PullRequest
0 голосов
/ 05 января 2010

У меня есть запрос LINQ to SQL, который возвращает сгруппированную коллекцию Sponsor объектов, например:

var result = ( from s in db.Sponsors
               join sl in sb.SponsorLevels on s.SponsorLevelId equals sl.SponsorLevelId
               select new Sponsor 
               {
                 Name = s.Name,
                 Level = sl.LevelName
               }
             ).GroupBy(s => s.LevelName);

Мое приложение уже использует интерфейс, определенный как ...

public interface ISponsorLevelGroup
{
    string Level { get; set; }
    IList<Sponsor> Sponsors { get; set; }
}

... где строковое свойство Level является ключом группировки из результата LINQ. В конечном итоге я хочу получить результат LINQ в IList<ISponsorLevelGroup>.

Логически мой результат LINQ to SQL представляет собой набор ISponsorLevelGroup объектов, но я не уверен, как наиболее эффективно сопоставить один объект другому. Мне кажется, что на данный момент я вынужден вручную обходить группы и коллекции внутри них и копировать данные в объекты, которые реализуют мой конкретный интерфейс. Есть ли способ лучше? Как я могу наиболее эффективно выдвинуть результат LINQ в IList<ISponsorLevelGroup>?

Ответы [ 2 ]

1 голос
/ 05 января 2010

Вы пробовали:

private class SponsorLevelGroup : ISponsorLevelGroup
{
   public string Level { get; set; }
   public IList<Sponsor> Sponsors { get; set; }
}

var result = ( from s in db.Sponsors
               join sl in sb.SponsorLevels on s.SponsorLevelId equals sl.SponsorLevelId
               select new Sponsor 
               {
                 Name = s.Name,
                 Level = sl.LevelName
               }
             ).GroupBy(s => s.LevelName)
              .Select(g => new SponsorLevelGroup
                               {
                                   Level = g.Key,
                                   Sponsors = g.ToList()
                                }) ;

Это должно вернуть вам коллекцию объектов ISponsorLevelGroup

0 голосов
/ 05 января 2010

Это то, что вам нужно? Я не создал новый класс Спонсора, как у вас. Посмотрите, имеет ли это смысл.

    public class Sponsor
    {
        public int SponsorLevelId { get; set; }
        public string Name { get; set; }

        public override string ToString()
        {
            return string.Format("Name: {0}", Name);
        }
    }

    public class SponsorLevel
    {
        public int SponsorLevelId { get; set; }
        public string LevelName { get; set; }
    }

    public class SponsorLevelGroup
    {
        public string Level { get; set; }
        public IList<Sponsor> Sponsors { get; set; }

        public override string ToString()
        {
            return string.Format("Level: {0} Sponsors: {1}", Level, Sponsors.Count);
        }
    }

    static void Main(string[] args)
    {
        List<Sponsor> sponsors = new List<Sponsor>()
        {
            new Sponsor { SponsorLevelId = 1, Name = "A" },
            new Sponsor { SponsorLevelId = 2, Name = "B" },
            new Sponsor { SponsorLevelId = 1, Name = "C" },
            new Sponsor { SponsorLevelId = 3, Name = "D" }
        };

        List<SponsorLevel> sponsorLevels = new List<SponsorLevel>()
        {
            new SponsorLevel { SponsorLevelId = 1, LevelName = "L1" },
            new SponsorLevel { SponsorLevelId = 2, LevelName = "L2" },
            new SponsorLevel { SponsorLevelId = 3, LevelName = "L3" }
        };

        var result = (from s in sponsors
                      join sl in sponsorLevels on s.SponsorLevelId equals sl.SponsorLevelId
                      group s by sl.LevelName into g
                      select new SponsorLevelGroup
                      {
                          Level = g.Key,
                          Sponsors = g.ToList()
                      }
         );

        foreach (var r in result)
        {
            Console.WriteLine(r);
        }
     }

Печать:

Level: L1 Sponsors: 2
Level: L2 Sponsors: 1
Level: L3 Sponsors: 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...