如何创建 linq 查询以将行连接成字符串?

How to create linq query to join rows into string?

我有一个包含以下字段的 table:

Id 姓名分数事件

(约翰一书 2 3) (约翰二书 4 3) (3 约翰 5 3)

我想得到以下结果:

(约翰, "2+4+5", 11(总分))

我正在尝试合并结果,以字符串格式显示总和,然后显示总和结果。 谁能帮我解决这个问题。 谢谢, 弗朗西斯

你需要这样的东西:

        var result = table
            .GroupBy(t => new { t.Name, t.Event })
            .ToList()
            .Select(t => new
            {
                Name = t.Key.Name,
                JoinedScores = string.Join(" + ", t.Select(group => group.Score).ToArray()),
                TotalScore = t.Sum(group => group.Score).ToString() + " (Total Score)"
            }).ToList();

需要第一次调用 ToList() 方法,因为 Linq to SQL 不支持对 string.Join() 的调用。我不确定,但也许您可以通过调用 AsEnumerable().

来替换它

这是我的代码:

 var model = (from Classificacao in _dbSet.classificacao
                     from Evento in _dbSet.evento
                     where Classificacao.class_id_Evento == id_evento
                     where Evento.id_evento == id_evento
                     group Classificacao by new
                     {
                         Classificacao.class_atletaNome,
                         Classificacao.class_numAtleta,
                         Classificacao.class_atletaEquipa,
                         Classificacao.class_paisAtleta,
                         Evento.even_name,
                         Evento.local.local_nome,
                         Evento.compTipo.CompTipo_name
                     } into g

                     select new
                     {
                         g.Key.class_numAtleta,
                         g.Key.class_atletaEquipa,
                         g.Key.class_atletaNome,
                         g.Key.class_paisAtleta,
                         class_fianlAtleta = g.Sum(c => c.class_fianlAtleta.Value),
                         class_classGeral = g.Min(c => c.class_fianlAtleta.Value),
                         class_nome = g.Key.even_name,
                         local_nome = g.Key.local_nome,
                         CompTipo_name = g.Key.CompTipo_name,
                         class_40ponto = ((from u in g
                                           where u.class_id_Evento == id_evento
                                           group u by new
                                           {
                                               u.class_atletaNome,
                                               u.class_fianlAtleta                                                  

                                           }
                                               into k
                                               select new
                                               {
                                                   //Score = string.Concat(k.Key.class_fianlAtleta.ToString(), " + ", g.Key.class_atletaNome)
                                                   Score = string.Format("{0}",k.Key.class_fianlAtleta)

                                               })).Select(c=>c.Score).FirstOrDefault()          


                     }).OrderBy(c => c.class_fianlAtleta).ThenBy(c => c.class_classGeral);de here

您需要在使用 string.Formatstring.Join 等方法之前调用 toList() 方法,因为 Linq to SQL.

不支持它们

您应该将代码修改成这样:

var group = (from Classificacao in _dbSet.classificacao
                 from Evento in _dbSet.evento
                 where Classificacao.class_id_Evento == id_evento
                 where Evento.id_evento == id_evento
                 group Classificacao by new
                 {
                     Classificacao.class_atletaNome,
                     Classificacao.class_numAtleta,
                     Classificacao.class_atletaEquipa,
                     Classificacao.class_paisAtleta,
                     Evento.even_name,
                     Evento.local.local_nome,
                     Evento.compTipo.CompTipo_name
                 } into g).ToList()

想法是在调用方法之前将查询具体化为列表。

                var model = group.Select(g => new
                 {
                     g.Key.class_numAtleta,
                     g.Key.class_atletaEquipa,
                     g.Key.class_atletaNome,
                     g.Key.class_paisAtleta,
                     class_fianlAtleta = g.Sum(c => c.class_fianlAtleta.Value),
                     class_classGeral = g.Min(c => c.class_fianlAtleta.Value),
                     class_nome = g.Key.even_name,
                     local_nome = g.Key.local_nome,
                     CompTipo_name = g.Key.CompTipo_name,
                     class_40ponto = ((from u in g
                                       where u.class_id_Evento == id_evento
                                       group u by new
                                       {
                                           u.class_atletaNome,
                                           u.class_fianlAtleta                                                  

                                       }
                                           into k
                                           select new
                                           {
                                               //Score = string.Concat(k.Key.class_fianlAtleta.ToString(), " + ", g.Key.class_atletaNome)
                                               Score = string.Format("{0}",k.Key.class_fianlAtleta)

                                           })).Select(c=>c.Score).FirstOrDefault()          


                 }).OrderBy(c => c.class_fianlAtleta).ThenBy(c => c.class_classGeral)).toList();

我无法检查代码是否正确,所以我把它留给你,无论如何,一旦你在内存中有了你的列表,你就可以将 Linq 支持的方法应用于实体。