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 № 1Você 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());
}
}
}