/ / ASP MVC 3 - Vincular consulta linq de várias tabelas ao gridview e exportar para .xls - asp.net-mvc, asp.net-mvc-3, linq, gridview, export

ASP MVC 3 - Vincular consulta linq de várias tabelas ao gridview e exportar para .xls - asp.net-mvc, asp.net-mvc-3, linq, gridview, export

Abaixo está uma consulta linq de duas tabelas que estou usando em um controlador ASP MVC 3 para exportar para um .xls Arquivo. A tabela que estou consultando, no entanto, tem um relacionamento um para muitos com uma tabela secundária. Quando passo o código, posso ver que a consulta linq foi executada como deveria, com a quantidade correta de informações no FixedStats e VariableStats Campos. No entanto, quando o arquivo é exportado para a planilha, essas duas colunas não são encontradas em nenhum lugar.

    public void ExportToCsv()
{

var grid = new System.Web.UI.WebControls.GridView();

//join a in db.BankListAgentId on b.ID equals a.BankID
var banks = from b in db.BankListMaster

where b.Status.Equals("A")
select new
{
BankName = b.BankName,
EPURL = b.EPURL.Trim(),
AssociatedTPMBD = b.AssociatedTPMBD,
Tier = b.Tier,
FixedStats = from a in db.BankListAgentId
where a.BankID == b.ID &&
a.FixedOrVariable.Equals("F")
select new { a.AgentId },
VariableStats = from a in db.BankListAgentId
where a.BankID == b.ID &&
a.FixedOrVariable.Equals("V")
select new { a.AgentId },
Attachment = b.Attachment,
Status = b.Status
};

grid.DataSource = banks.ToList();
grid.DataBind();

Response.ClearContent();
Response.AddHeader("content-disposition", "attachment; filename=BankList.xls");
Response.ContentType = "application/excel";
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
grid.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
}

Respostas:

1 para resposta № 1

Você poderia usar String.Join para combinar a lista de AgentId valores em uma sequência e forneça-a à grade. Atualmente FixedStats e VariableStats são listas que não podem ser apresentadas como valores de células da grade:

  select new
{
FixedStats = String.Join("|", from a in db.BankListAgentId
where a.BankID == b.ID &&
a.FixedOrVariable.Equals("F")
select a.AgentId.ToString()),
}

Como o Stunt Double da Moby notou, seria recomendável criar um modelo de exibição dedicado. A solução acima pode não funcionar, devido a problemas de tradução do ORM <-> SQL.

Exemplo de ViewModel dedicado:

public class ExportVM
{
public List<int> FixedStats { get; set; }
public FixedStatsCombined
{
get
{
return String.Join("|", FixedStats.Select(item => item.ToString());
}
}
}