Inquiridor
Preenchendo datagrid no linq usando 2 tabelas

Pergunta
-
Pessoal estou com uma grande dificuldade ao preencher um datagrid com ingormações em 2 tabelas ver imagem(http://admin.paulistasul.org.br/2.jpg), este datagrid tem que ser "ToList().AsQueryable()" pois ao clicar na linha no datagrid pego os valores e jogo em um grid que devolvo os valores para edição. Como na imagem(http://admin.paulistasul.org.br/1.jpg):
Usei a seguinte query:
public static IEnumerable<Campaign> ListByCampaign(SVCEntities cx) { return (from c in cx.Campaign join g in cx.GenericType on c.CampaignTypeID equals g.TypeID where g.TypeName.Equals("Campaign") select c).ToList().AsQueryable(); }
não consigo trazer a descriçãodo da campanha que está na tabela "GenericType" campo"Description":
Temtei até fazer de uma forma simples no xaml:
<DataGridTextColumn x:Name="campaignTypeIDColumn2" Binding="{Binding Path=GenericType.Description}" Header="Tipo2_" Width="70" />
E não deu certo.
Quando uso a seguinte query, consigo trazer o resultado, porem ao clicar na linha do datagrid ela não é mais editavel ou seja não consigo trazer o valores para o grid do form.
public static IEnumerable<Campaign> ListCampaign(SVCEntities cx) { return (from c in cx.Campaign join g in cx.GenericType on c.CampaignTypeID equals g.TypeID where g.TypeName.Equals("Campaign") orderby c.Name select new { CampaignID = c.CampaignID, CampaignTypeID = c.CampaignTypeID, DescriptionCampaignType = g.Description, Leader = c.Leader, Name = c.Name, ViceLeader = c.ViceLeader, PriceTableID = c.PriceTableID, }).ToList() .Select(p => new Campaign() { CampaignID = p.CampaignID, CampaignTypeID = p.CampaignTypeID, DescriptionCampaignType = p.DescriptionCampaignType, Leader = p.Leader, Name = p.Name, ViceLeader = p.ViceLeader, PriceTableID = p.PriceTableID, }); }
Alguém tem alguma solução ou um dica pro meu problema?
at.
Moizés Cerqueira | MCP
Site: www.moizes.cerqueira.nom.br
Twitter: @moicer
Todas as Respostas
-
Amigo, temos duas possiveis soluções pra isto. Possivelmente seu modelo está como Lazy Loading, oque quer dizer que entidades relacionadas so serão carregadas sob demanda. Recomendo que você inclua na sua consulta o método include que informa para carregar a entidade relacionada junto com a entidade principal em tempo de consulta(Eager load), por exemplo:
public static IEnumerable<Campaign> ListByCampaign(SVCEntities cx) { return (from c in cx.Campaign.Include("GenericType") join g in cx.GenericType on c.CampaignTypeID equals g.TypeID where g.TypeName.Equals("Campaign") select c).ToList().AsQueryable(); }
Olavo Oliveira Neto
http://olavooneto.wordpress.com
Se for útil marque como resposta e faça um Developer feliz :) -
Olavo, não obtive sucesso, não sei mais o que tentar, teoricamente parece ser simples no Binding do campo no datagrid passo nome tabela.campo e nada, tem alguma outra coisa que possa me ajudar?
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" ItemsSource="{Binding}" Name="campaignDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Grid.Row="4" Grid.Column="1" IsReadOnly="True" SelectionChanged="campaignDataGrid_SelectionChanged">
<DataGrid.Columns>
<DataGridTextColumn x:Name="campaignIDColumn" Binding="{Binding Path=CampaignID}" Header="Código" Width="Auto" />
<DataGridTextColumn x:Name="nameColumn" Binding="{Binding Path=Name}" Header="Nome Campanha" Width="250" />
<DataGridTextColumn x:Name="Type" Binding="{Binding Path=GenericType.Description}" Header="Tipo" Width="auto"/>
<DataGridTextColumn x:Name="leaderColumn" Binding="{Binding Path=Leader}" Header="Lider" Width="200" />
<DataGridTextColumn x:Name="viceLeaderColumn" Binding="{Binding Path=ViceLeader}" Header="Vice-Lider" Width="200" />
</DataGrid.Columns>
Moizés Cerqueira | MCP
Site: www.moizes.cerqueira.nom.br
Twitter: @moicer