Search code examples
c#linq-to-entities

Average linq in select new


Help me

I have this class:

public class CLASS_list_dati_esport_CATASTO
        {
            public Int64 Id_vertice;
            public string Denominazione;
            public string Materializzazione;
            public string Escluso;
            public string Origine;
            public string Stato;
            public string Ordine_cat;
            public string Ordine_roma40;
            public string Relazione_bessell;
            public string Relazione_roma40;
            public string Posizione_da_cartografia;
            public string Posizione_dai_registri;
            public double Media_nord;
            public double Nord;
            public double Media_est;
            public double Est;
            public string Cord_fittizia;
            public string Cord_esclusa;
        }

And this statement:

List<CLASS_list_dati_esport_CATASTO> list_dati_esport_CATASTO = Carica_list_dati_CATASTO();

(Carica_list_data_CATASTO () is a function that adds elements in list_data_esport_CATASTO).

I would like to extract all the elements in the list_data_esport_CATASTO and in the item 'Media_est' i would like to assign the average of the item 'est' grouped according to the field id_vertice.

    var query = from elemento in list_dati_esport_CATASTO


                select new CLASS_list_dati_esport_CATASTO
                {
                    Id_vertice = elemento.Id_vertice,
                    Denominazione =elemento.Denominazione,
                    Materializzazione= elemento.Materializzazione,
                    Escluso = elemento.Escluso,
                    Origine = elemento.Origine,
                    Stato = elemento.Stato,
                    Ordine_cat = elemento.Ordine_cat,
                    Ordine_roma40 = elemento.Ordine_roma40,
                    Relazione_bessell = elemento.Relazione_bessell,
                    Relazione_roma40 = elemento.Relazione_roma40,
                    Posizione_da_cartografia = elemento.Posizione_da_cartografia,
                    Posizione_dai_registri = elemento.Posizione_dai_registri,
                    Media_nord = elemento.Media_nord,
                    Nord = elemento.Nord,

                    Media_est = from sottoelemento in list_dati_esport_CATASTO group sottoelemento by sottoelemento.Id_vertice into raggruppamento select new { Media_nord = raggruppamento.Average(p => p.est)},

                    Est = elemento.Est,
                    Cord_fittizia = elemento.Cord_fittizia,
                    Cord_esclusa = elemento.Cord_esclusa
                };




    foreach (var item in query)
    {
        MessageBox.Show(item.Media_est.ToString());
    }

but

from sottoelemento in list_dati_esport_CATASTO group sottoelemento by sottoelemento.Id_vertice into raggruppamento select new { Media_nord = raggruppamento.Average(p => p.est)}

is definitely wrong.


Solution

  • Linq is a query which is a read operation and trying to read and write average at same time doesn't work. Try code below

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<CLASS_list_dati_esport_CATASTO> list_dati_esport_CATASTO = new List<CLASS_list_dati_esport_CATASTO>();
    
                var query = list_dati_esport_CATASTO
                    .GroupBy(x => x.Id_vertice)
                    .Select(x => new { esport_CATASTO = x.First(), average = x.Average(y => y.Est) })
                    .ToList();
    
                foreach (var item in query)
                {
                    item.esport_CATASTO.Est = item.average;
                }
    
                List<CLASS_list_dati_esport_CATASTO> results = query.Select(x => x.esport_CATASTO).ToList();
    
            }
        }
        public class CLASS_list_dati_esport_CATASTO
        {
            public Int64 Id_vertice;
            public string Denominazione;
            public string Materializzazione;
            public string Escluso;
            public string Origine;
            public string Stato;
            public string Ordine_cat;
            public string Ordine_roma40;
            public string Relazione_bessell;
            public string Relazione_roma40;
            public string Posizione_da_cartografia;
            public string Posizione_dai_registri;
            public double Media_nord;
            public double Nord;
            public double Media_est;
            public double Est;
            public string Cord_fittizia;
            public string Cord_esclusa;
        }
    }