none
llenar un dataset con un query en linq

    Pregunta

  • hola un saludo antes de todo

    este es mi problema, tengo 2 datasets, que son mi origen de datos, en estos  genero un inner join,con linq y el resultado lo quisiera  meter en otro nuevo dataset para regresar este. mi codigo es el siguiente:

     var GirosCRM = from v in ds.Tables[0].AsEnumerable()
    
           join descCRM in dsGirosCRM.Tables[0].AsEnumerable()
    
           on v.Field<int>("ID_Giro") equals descCRM.Field<int>("PT_GiroID")
    
    
    
               select new 
    
               {
    
                ID_comercio = v.Field<int>("ID_comercio"),
    
                RazonSocial = v.Field<string>("RazonSocial"),
    
                FechaFinContrato = v.Field<DateTime>("FechaFinContrato"),
    
                ID_StatusComercio = v.Field<int>("ID_StatusComercio"),
    
                DescripcionModelo = v.Field<string>("DescripcionModelo"),
    
                GrupoEmpresaAfiliada = v.Field<string>("GrupoEmpresaAfiliada"),
    
                ReferenciaBancaria = v.Field<string>("ReferenciaBancaria"),
    
                Descripcion = v.Field<string>("Descripcion"),
    
                ID_TipoEmpresa = v.Field<int>("ID_TipoEmpresa"),
    
                 DescripcionGiro = descCRM.Field<string>("PT_Nombre"),
    
    
    
               };
    
          
    
       dt = GirosCRM.CopyToDataTable<DataRow>();

    la variable: GirosCRM, le cambio su tipo de var a: IEnumerable<datarow> y es aqui donde  obtengo una excepcion que me dice: que no se puede convertir implicitamente del tipo ienumerable<datarow> a IEnumerable<Anonymous#1>, pero si lo dejo como var al momento dellenarlo a la tabla  me manda la misma excepcion, notese q el origen de datos son datasets locales.

     

    espero me aya hecho entender, Alguna Idea???

    Gracias de antemano

    viernes, 05 de noviembre de 2010 15:49

Respuestas

  • hola

    podrias hacer algo como esto

    var GirosCRM = from v in ds.Tables[0].AsEnumerable()
           join descCRM in dsGirosCRM.Tables[0].AsEnumerable()
           on v.Field<int>("ID_Giro") equals descCRM.Field<int>("PT_GiroID")
               select new
               {
                ID_comercio = v.Field<int>("ID_comercio"),
                RazonSocial = v.Field<string>("RazonSocial"),
                FechaFinContrato = v.Field<DateTime>("FechaFinContrato"),
                ID_StatusComercio = v.Field<int>("ID_StatusComercio"),
                DescripcionModelo = v.Field<string>("DescripcionModelo"),
                GrupoEmpresaAfiliada = v.Field<string>("GrupoEmpresaAfiliada"),
                ReferenciaBancaria = v.Field<string>("ReferenciaBancaria"),
                Descripcion = v.Field<string>("Descripcion"),
                ID_TipoEmpresa = v.Field<int>("ID_TipoEmpresa"),
                DescripcionGiro = descCRM.Field<string>("PT_Nombre"),
               };

    DataTable dt = new DataTable();
    dt.Columns.Add("ID_comercio");
    dt.Columns.Add("RazonSocial");
    dt.Columns.Add("FechaFinContrato");
    .
    .
              
    foreach(var item in GirosCRM)
    {
        Datarow row = dt.NewRow();
        row["ID_comercio"] = item.ID_comercio;
        row["RazonSocial"] = item.RazonSocial;
        row["FechaFinContrato"] = item.FechaFinContrato;
        .
        .
        dt.Rows.Add(row);
    }

     

    o sino algo como menciono en este link

    Linq DataSet – Agrupar y totalizar

    en el titulo "Creación del DataTable con CopyToDataTable()"

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 05 de noviembre de 2010 16:14

Todas las respuestas

  • Esto pasa porque al hacer select new el lenguaje lo toma como un tipo anonymo, por tanto beberias definir un nuevo tipo sea una clase o metodo que devolverá el valor anónimo,  de esa forma podrias hacer

    select new myclase

     

    Mira estos enlances que hablan un poco sobre el tema

    http://www.davidhayden.com/blog/dave/archive/2006/12/06/AnonymousTypesCSharp.aspx

    http://www.codedigest.com/Articles/Framework/197_Anonymous_Types_in_LINQ_A_Step_Ahead_Series.aspx

    http://stackoverflow.com/questions/1070526/how-to-return-anonymous-type-from-c-method-that-uses-linq-to-sql

     

    viernes, 05 de noviembre de 2010 16:10
  • hola

    podrias hacer algo como esto

    var GirosCRM = from v in ds.Tables[0].AsEnumerable()
           join descCRM in dsGirosCRM.Tables[0].AsEnumerable()
           on v.Field<int>("ID_Giro") equals descCRM.Field<int>("PT_GiroID")
               select new
               {
                ID_comercio = v.Field<int>("ID_comercio"),
                RazonSocial = v.Field<string>("RazonSocial"),
                FechaFinContrato = v.Field<DateTime>("FechaFinContrato"),
                ID_StatusComercio = v.Field<int>("ID_StatusComercio"),
                DescripcionModelo = v.Field<string>("DescripcionModelo"),
                GrupoEmpresaAfiliada = v.Field<string>("GrupoEmpresaAfiliada"),
                ReferenciaBancaria = v.Field<string>("ReferenciaBancaria"),
                Descripcion = v.Field<string>("Descripcion"),
                ID_TipoEmpresa = v.Field<int>("ID_TipoEmpresa"),
                DescripcionGiro = descCRM.Field<string>("PT_Nombre"),
               };

    DataTable dt = new DataTable();
    dt.Columns.Add("ID_comercio");
    dt.Columns.Add("RazonSocial");
    dt.Columns.Add("FechaFinContrato");
    .
    .
              
    foreach(var item in GirosCRM)
    {
        Datarow row = dt.NewRow();
        row["ID_comercio"] = item.ID_comercio;
        row["RazonSocial"] = item.RazonSocial;
        row["FechaFinContrato"] = item.FechaFinContrato;
        .
        .
        dt.Rows.Add(row);
    }

     

    o sino algo como menciono en este link

    Linq DataSet – Agrupar y totalizar

    en el titulo "Creación del DataTable con CopyToDataTable()"

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 05 de noviembre de 2010 16:14
  • ei  gracias por sus respuestas  estoy probando  los ejemplos  que me dieron 

    cualquier cosa les aviso gracias

     

    viernes, 05 de noviembre de 2010 17:32
  • Bueno mi codigo quedo asi:

      IEnumerable<Datos> GirosCRM = from v in ds.Tables[0].AsEnumerable()
                         join descCRM in dsGirosCRM.Tables[0].AsEnumerable()
                          on v.Field<int>("ID_Giro") equals descCRM.Field<int>("PT_GiroID")
                         select new Datos
                         {
                           ID_comercio = v.Field<int>("ID_comercio"),
                           RazonSocial = v.Field<string>("RazonSocial"),
                           FechaFinContrato = v.Field<DateTime>("FechaFinContrato"),
                           ID_StatusComercio = v.Field<int>("ID_StatusComercio"),
                           DescripcionModelo = v.Field<string>("DescripcionModelo"),
                           GrupoEmpresaAfiliada = v.Field<string>("GrupoEmpresaAfiliada"),
                           ReferenciaBancaria = v.Field<string>("ReferenciaBancaria"),
                           Descripcion = v.Field<string>("Descripcion"),
                           ID_TipoEmpresa = v.Field<int>("ID_TipoEmpresa"),
                           DescripcionGiro = descCRM.Field<string>("PT_Nombre")
    
                         };
    
        
          dt = GirosCRM.CopyToDataTable<Datos>();

    me manda una excepcion en el lado del CopyToDataTable:  the type 'Datos'  cannot be used as type parameter 'T'  in the generic type or method, la verdad no se como solucionarlo,

    por el metodo que me sugirio leandro quedo asi:

      var GirosCRM = from v in ds.Tables[0].AsEnumerable()
                         join descCRM in dsGirosCRM.Tables[0].AsEnumerable()
                          on v.Field<int>("ID_Giro") equals descCRM.Field<int>("PT_GiroID")
                         select new 
                         {
                           ID_comercio = v.Field<int>("ID_comercio"),
                           RazonSocial = v.Field<string>("RazonSocial"),
                           FechaFinContrato = v.Field<DateTime>("FechaFinContrato"),
                           ID_StatusComercio = v.Field<int>("ID_StatusComercio"),
                           DescripcionModelo = v.Field<string>("DescripcionModelo"),
                           GrupoEmpresaAfiliada = v.Field<string>("GrupoEmpresaAfiliada"),
                           ReferenciaBancaria = v.Field<string>("ReferenciaBancaria"),
                           Descripcion = v.Field<string>("Descripcion"),
                           ID_TipoEmpresa = v.Field<int>("ID_TipoEmpresa"),
                           DescripcionGiro = descCRM.Field<string>("PT_Nombre")
    
                         };
    
        
              foreach (var item in GirosCRM)
              {
                DataRow row = dt.NewRow();
                row["ID_comercio"] =Convert.ToInt32(item.ID_comercio.ToString());
                row["RazonSocial"] = item.RazonSocial.ToString();
                row["FechaFinContrato"] =Convert.ToDateTime(item.FechaFinContrato.ToString());
                row["ID_StatusComercio"] =Convert.ToInt32(item.ID_StatusComercio.ToString());
                row["DescripcionModelo"] = item.DescripcionModelo.ToString();
                row["GrupoEmpresaAfiliada"] = item.GrupoEmpresaAfiliada.ToString();
                row["ReferenciaBancaria"] = item.ReferenciaBancaria.ToString();
                row["Descripcion"] = item.Descripcion.ToString();
                row["ID_TipoEmpresa"] =Convert.ToInt32(item.ID_TipoEmpresa.ToString());
                row["DescripcionGiro"] = item.DescripcionGiro.ToString();
    
                dt.Rows.Add(row);
              }
    
    

    pero  me manda la excepcion que la conversion es invalida solo asi me dice  ee tratado de ver si un campo no se me escapo pero todo esta en orden

     

    si alguien tiene alguna idea Gracias

    viernes, 05 de noviembre de 2010 18:33
  • Hola

    ¿ Has podido solucionar tu problema ?

    Saludos

    Eduardo Portescheller
    martes, 09 de noviembre de 2010 12:40
  • Excelente justo lo que buscaba GRACIAS

     

    miércoles, 15 de junio de 2011 10:16