Olá pessoal, meu nome é Mauricio Junior e hoje eu vou mostrar pra você como trabalhar com Entity Framework, LINQ e retonar campos não mapeados no database. Eu vou falar mais sobre o problema e sobre a solução no decorrer do artigo. Veja as ferramentas que eu utilizei:
- Linguagem C#
- Ferramenta: Visual Studio ou Rider
- Database: SQL Server
- Framework: .NETCore e EntityFramework
Problema:
O problema que tenho é porque uso mais de uma tabela do database e preciso retornar dados misturados usando apenas uma entidade da tabela do database. Com o EntityFramework é necessário criar uma entidade diferente e depois retornar os dados.
Solução:
Para a solução do meu problema sem precisar novas entidades, basta colocar uma tag [NotMapped]
em cima da propriedade.
Vou analisar o código da Model referente a entidade.
Código 1.1 - Insert
public bool Insert(ScheduleModel model)
{
try
{
_db.ScheduleModelDbSet.Add(model);
_db.SaveChanges();
return true;
}
catch(Exception ex)
{
throw ex;
}
}
Usando o entity framework e para inserir valores no database basta adicionar a model e mandar salvar. As propriedades mapeadas são exatamentes os campos do database.
Código 1.2 - Model Schedule
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace GiftWeb.Model
{
[Table("Schedule", Schema = "dbo")]
public class ScheduleModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int IdSchedule { get; set; }
public DateTime DateSchedule { get; set; }
public string InitialHourSchedule { get; set; }
public string EndHour { get; set; }
public int UserDonorsId { get; set; }
public string Observation { get; set; }
public DateTime Date { get; set; }
public int UserDonorsIdInserted { get; set; }
[NotMapped]
public string Name { get; set; }
[NotMapped]
public string Email { get; set; }
[NotMapped]
public string Phone { get; set; }
}
}
Analisando todo o código, eu coloquei as últimas propriedades como [NotMapped] e que serão retornados pelo SELECT específico. Os campos Name, Email e Phone não estão no database da tabela ["Schedule"] e por isso eu coloquei na entidade não mapeada.
O código 1.3 - Retorna dados de mais de uma tabela.
public IEnumerable<ScheduleModel> GetScheduleByIdUser(int idUser)
{
var query = (from schedule in _db.ScheduleModelDbSet
join user in _db.DonorsUserDbSet
on schedule.UserDonorsId equals user.UserDonorsId
where schedule.UserDonorsId == idUser
select new ScheduleModel
{
Name = user.Phone,
Email = user.EmailDonors,
Phone = user.Phone,
IdSchedule = schedule.IdSchedule,
DateSchedule = schedule.DateSchedule,
Observation = schedule.Observation,
InitialHourSchedule = schedule.InitialHourSchedule,
EndHour = schedule.EndHour,
UserDonorsId = schedule.UserDonorsId
});
return query.OrderBy(x=>x.Name);
}
Eu pego os dados de uma tabela de usuário e depois pego os dados da tabela schedule como colocado no código 1.3. Bastou colocar [NotMapped] para os dados serem mostrados na tela do usuário.
Bom, espero ter ajudado e qualquer coisa pode falar comigo pelo site www.mauriciojunior.