none
Expresión lambda me da un error RRS feed

  • Pregunta

  • Tengo dos tablas, Titulo y Editor, con un campo clave en cada una de ellas llamado Id_EDITOR, que las relaciona.

    Tengo el siguiente método:

    public IEnumerable<Titulo> GetAllTitulos()
            {
                var titulos = this.Titulo
                    .Select(t => new { t.Id_TITULO, t.TITULO1, t.FECHAREAL, t.Id_EDITOR })
                    .Join(this.Editor, ei => ei.Id_EDITOR, ed => ed.EDITOR1,
                    (ei, ed) => new {
                        cIdTitulo = ei.Id_TITULO,
                        cTitulo = ei.TITULO1,
                        cFechaReal = ei.FECHAREAL,
                        cEditor =  ed.EDITOR1 });
    
                return titulos;
            }

    Me da el siguiente error: Los argumentos de tipo para el método 'Queryable.Join<TOuter, TInner, TKey, TResult>' no se pueden inferir a partir del uso. Pruebe a especificar los argumentos de tipo explicitamente.

    ¿Alguien me puede ayudar diciéndome como se hace esto?

    Muchísimas gracias.


    jueves, 7 de marzo de 2019 8:22

Todas las respuestas

  • Hola,

    this.Titulo

    De qué tipo es? 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 7 de marzo de 2019 9:09
    Moderador
  • this.Titulo es el nombre de la Tabla Titulo.

    En realidad podría haberlo puesto así:

    public IEnumerable<Titulo> GetAllTitulos()         {             var titulos = Titulo                 .Select(t => new { t.Id_TITULO, t.TITULO1, t.FECHAREAL, t.Id_EDITOR })                 .Join(Editor, ei => ei.Id_EDITOR, ed => ed.EDITOR1,                 (ei, ed) => new {                     cIdTitulo = ei.Id_TITULO,                     cTitulo = ei.TITULO1,                     cFechaReal = ei.FECHAREAL,                     cEditor =  ed.EDITOR1 });             return titulos;         }

    Espero haber aclarado tus dudas.

    Muchas gracias.

    jueves, 7 de marzo de 2019 10:05
  • Prueba a reescribirla con la sintaxis "de lenguaje" en lugar de llamar directamente a los metodos de extension:

    public IEnumerable<Titulo> GetAllTitulos()
    {
        return(
            from t in Titulo 
            join ed in Editor on t.Id_EDITOR equals ed.EDITOR1
            select new {
                        cIdTitulo = t.Id_TITULO,
                        cTitulo = t.TITULO1,
                        cFechaReal = t.FECHAREAL,
                        cEditor =  ed.EDITOR1 }
        );
    }
    

    jueves, 7 de marzo de 2019 14:28
    Moderador
  • Muchas gracias por tu interés.

    Te diré. Lo he hecho como me indicas y me da un error que dice:

    No se puede convertir implicitamente  el tipo 'System.Linq.IQueryable <anonymous type ....>' en System.Collections.Generics.IEnumerable. Ya existe una conversión explícita (comprueba si falta una conversión)

    Reitero mis infinitas gracias. 

    jueves, 7 de marzo de 2019 16:16
  • Hola, te falta agregar un ToList() o un ToArray() para devolver un IEnumerable como se indica en la definición de tu método  

        return(
            from t in Titulo 
            join ed in Editor on t.Id_EDITOR equals ed.EDITOR1
            select new {
                        cIdTitulo = t.Id_TITULO,
                        cTitulo = t.TITULO1,
                        cFechaReal = t.FECHAREAL,
                        cEditor =  ed.EDITOR1 }
        ).ToList();
    Y creo que tampoco te va a funcionar ya que esperas devolver un IEnumerable<Titulo> y actualmente estás devolviendo un tipo anonimo

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    jueves, 7 de marzo de 2019 17:01
    Moderador
  • Efectivamente así tampoco funciona.

    Es curioso que si lo hago sin el join, funciona perfectamente, o sea, si pongo:

    publicIEnumerable<Titulo>GetAllTitulos()

    {             var titulos = this.Titulo.Select(x => new { x.Id_TITULO, x.TITULO1, x.FECHAREAL }).OrderBy(x => x.TITULO1);
                return titulos;

    }

           

    Muy agradecido por tu interés. Un saludo.


    jueves, 7 de marzo de 2019 17:33
  • Hola, y devolviendo un Título te funciona?

    return(
            from t in Titulo 
            join ed in Editor on t.Id_EDITOR equals ed.EDITOR1
            select t).ToList();


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 12 de marzo de 2019 7:43
    Moderador
  • Muchas gracias por tu interés. Te comentaré que tampoco me funciona de esta manera.

    Estoy desesperado pues no encuentro ninguna solución al problema.

    Reitero mi agradecimiento.

    martes, 12 de marzo de 2019 10:26
  • Hola, puedes mostrar código de cómo has definido tus clases Titulo, Editor y cómo llamas al método GetAllTitulos?

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 12 de marzo de 2019 11:35
    Moderador
  • Hola Según tu código, tengo dudas que te pongo en comentarios dentro del codigo.

    public IEnumerable<Titulo> GetAllTitulos() // este Titulo a qué hace referencia? 
            {
                var titulos = Titulo // Aquí comentaste que es tu TABLA
                    .Select(t => new { t.Id_TITULO, t.TITULO1, t.FECHAREAL, t.Id_EDITOR })
                    .Join(Editor, ei => ei.Id_EDITOR, ed => ed.EDITOR1,
                    (ei, ed) => new {
                        cIdTitulo = ei.Id_TITULO,
                        cTitulo = ei.TITULO1,
                        cFechaReal = ei.FECHAREAL,
                        cEditor =  ed.EDITOR1 });
    
                return titulos;
            }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 12 de marzo de 2019 11:39
    Moderador
  • Buenas tardes, de nuevo muchísimas gracias por tu interés.

    Voy a ver si soy capaz de explicarte el tema de tal forma que me entiendas:

    Según un artículo de Vikram Chandhary, publicado con fecha 29/10/2015 y titulado DataGrid binding using LINQ to SQL WPF (lo traduzco mediante el traductor de Google), hago lo siguiente:

    1.- Creo un proyecto WPF, que en mi caso llamo "ApEditarTitulos"

    2.- Agrego una nueva clase que denomino "EditarTitulos" creándose la clase EditarTitulos.dbml

    3.- Agrego las correspondientes tablas, arrastrándolas desde el explorador de servidores, en este caso las tablas son Titulo y Editor que están relacionadas mediante un campo al que llamo Id_EDITOR (el nombre es el mismo en ambas tablas, para mi mayor claridad)

    4.- Haciendo click derecho sobre el archivo EditarTitulos.cs --> Ver código. Aquí escribo lo siguiente:

    using System.Linq;
    using System.Collections.Generic;
    namespace ApEditarTitulos 
    {
       public partial class EditarTitulosDataContext
          {
             public IEnumerable<Titulo> GetAllTitulos()
                {
                   var titulos = this.Titulo
                     .Select(t => new { t.Id_TITULO, t.TITULO1, t.FECHAREAL, t.Id_EDITOR })
                     .Join(this.Editor, tit => tit.Id_EDITOR, edi => edi.Id_EDITOR,
                     (tit, edi) => new { tit.Id_TITULO, tit.TITULO1, tit.FECHAREAL, edi.EDITOR1 });
    
                 return titulos;
                 }
            }
    }

    5.- Ahora escribo un ObjectDataProvider en MainWindow.xaml

     
    <Window.Resources>
            <ObjectDataProvider x:Key="getTitulos" ObjectType="{x:Type local:EditarTitulosDataContext}" 
                                MethodName="GetAllTitulos"></ObjectDataProvider>
        </Window.Resources>
    
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition></RowDefinition>
    
            </Grid.RowDefinitions>
            <DataGrid x:Name="myDataGrid" x:Uid="myDataGrid" AutoGenerateColumns="False"
                      AlternatingRowBackground="#EAADEA" Margin="0,31,0,0" ItemsSource="{Binding}"
                      IsSynchronizedWithCurrentItem="True">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Path=Id_TITULO}" IsReadOnly="True"
                                        Header="Id. Título" Width="100"/>
                    <DataGridTextColumn Binding="{Binding Path=TITULO1}" Width="400" Header="Título"/>
                    <DataGridTextColumn Binding="{Binding Path=EDITOR1}" Width="210" Header="Editor"/>
                    <DataGridTextColumn Binding="{Binding Path=FECHAREAL, StringFormat=dd/MM/yyyy}" Width="110"
                                        Header="Fecha Publicación"/>
                </DataGrid.Columns>
            </DataGrid>
            <StackPanel Grid.Row="4" Grid.Column="2" Orientation="Horizontal">
                <Button Content="Aceptar Cambios" x:Name="AceptarCambios" Click="AceptarCambios_Click"
                Width="150" Margin="5,374,5,5"></Button>
                <Button Content="Cancelar Cambios" x:Name="CancelarCambios" Click="CancelarCambios_Click"
                        Width="150" Margin="5,374,5,5"/>
            </StackPanel>
        </Grid>

    Tan pronto como hayamos terminado la codificación anterior, si ejecutamos la aplicación veremos que el DataGrid se rellena con los datos.

    Con el código que me envías me aparece el siguiente error (que es el mismo que me aparece con el código que pongo yo):

    Los argumentos de tipo para el método 'Queryable.Join<TOuter, TInner, TKey, TResult>' no se pueden inferir a partir del uso. Pruebe a especificar los argumentos de tipo explicitamente.

    Muchas gracias por tu paciencia.


    martes, 12 de marzo de 2019 17:19
  • Hola, prueba a eliminar esta parte de tu consulta

     .Select(t => new { t.Id_TITULO, t.TITULO1, t.FECHAREAL, t.Id_EDITOR })

      public IEnumerable<Titulo> GetAllTitulos()
    
                {
    
                   var titulos = this.Titulo 
                     .Join(this.Editor, tit => tit.Id_EDITOR, edi => edi.Id_EDITOR,
                     (tit, edi) => new { tit.Id_TITULO, tit.TITULO1, tit.FECHAREAL, edi.EDITOR1 });
    
                 return titulos;
    
                 }
    
            }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 12 de marzo de 2019 17:41
    Moderador
  • o también establece las propiedades en tu tipo anónimo

     var titulos = this.Titulo
                     .Select(t => new { Id_TITULO = t.Id_TITULO, TITULO1 =  t.TITULO1, FECHAREAL = t.FECHAREAL, Id_EDITOR = t.Id_EDITOR })
                     .Join(this.Editor, tit => tit.Id_EDITOR, edi => edi.Id_EDITOR,
                     (tit, edi) => new { tit.Id_TITULO, tit.TITULO1, tit.FECHAREAL, edi.EDITOR1 });


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 12 de marzo de 2019 17:47
    Moderador
  • Tanto en un caso como en el otro me da el siguiente error:

    No se puede convertir implicitamente el tipo 'System.Linq.IQueryable<anonymus type...> en System.Collections.Generic.IEnumerable'. Ya existe una conversión explicita (compruebe si falta una conversión).

    Como ya he mencionado anteriormente, si le quito a la expresión la clausula join, funciona correctamente. No lo entiendo!!!.

    Muchas gracias por el interés puesto en mi problema.

    martes, 12 de marzo de 2019 19:26
  • Hola. Puedes mostrar cómo está definida tu entidad Titulo? Posee propiedades de navegación con Editor? Entonces no te haría falta establecer el join.

    public IEnumerable<Titulo> GetAllTitulos()
                {
                   var titulos = this.Titulo
                     .Select(t => new { t.Id_TITULO, t.TITULO1, t.FECHAREAL, t.Id_EDITOR, t.Editor.EDITOR1});
    
                 return titulos;
                 }
            }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    martes, 12 de marzo de 2019 22:42
    Moderador
  • Ten en cuenta que estoy utilizando Clases de LINQ to SQL y no ADO.NET Entity Data Model.

    De todas las formas lo he probado como me indicas en tu última respuesta y me da el mismo error, o sea, 

    No se puede convertir implicitamente el tipo 'System.Linq.IQueryable<anonymus type...> en System.Collections.Generic.IEnumerable'. Ya existe una conversión explicita (compruebe si falta una conversión).

    Muchísimas gracias.

    miércoles, 13 de marzo de 2019 15:19