代码之家  ›  专栏  ›  技术社区  ›  Chris Farmer Marcelo Cantos

如何将LINQ到SQL分组结果映射到此现有接口?

  •  0
  • Chris Farmer Marcelo Cantos  · 技术社区  · 15 年前

    我有一个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 String属性是Linq结果的分组键。我最终想把LINQ结果变成 IList<ISponsorLevelGroup> .

    逻辑上,我的linq to sql结果是 ISponsorLevelGroup 对象,但我不确定如何最有效地将一个映射到另一个。此时,我似乎被降级为手动遍历组及其内部的集合,并将数据复制到实现特定接口的对象中。有更好的方法吗?如何最有效地将LINQ结果 iList<isMonsorLevelGroup> ?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Ian Johnson    15 年前

    你试过了吗?

    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对象

        2
  •  0
  •   bruno conde    15 年前

    这就是你需要的吗?我没有像你一样创建一个新的赞助商类。看看这是否合理。

        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