-2
Hello, I’m trying to find the amount of records with the same name, from a certain column in my Lead table in the database in a period (month). Follow my class, I want to search only from the field "Origin"
public class Lead
{
internal Lead(INotificationHandler notificationHandler)
{
_notificationHandler = notificationHandler;
}
public string Name { get; set; }
public string Telephone { get; set; }
public string Email { get; set; }
public TreatmentOfInterest TreatmentOfInterest { get; set; }
public string Origin { get; set; }
public Guid PatientId { get; set; }
public Guid CalendarId { get; set; }
public virtual Calendar Calendar { get; set; }
}
My DTO for return:
public class LeadOriginDto
{
public LeadOriginDto()
{
Origins = new List<string>();
}
public List<string> Origins { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public Guid? CalendarId { get; set; }
}
My repository interface left these two methods to know which I would have better performance:
public interface ILeadRepository : IRepository<Lead>
{
Task<int> LeadsCountForOrigin(DateTime date);
IQueryable<Lead> LeadsCountForOrigin(LeadOriginDto origin);
}
And my repository class where I want to create the query:
internal class LeadRepository : Repository<Lead>, ILeadRepository
{
private readonly DbSet<Lead> _leads;
public LeadRepository(IDbContext context)
: base(context)
{
_leads = context.Set<Lead>();
}
public Task<int> LeadsCountForOrigin(DateTime date)
{
throw new NotImplementedException();
}
public async IQueryable<Lead> LeadsCountForOrigin(LeadOriginDto origin)
{
var date = new DateTime();
var firstDayOfMonth = new DateTime(date.Year, date.Month, 1);
var lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);
IQueryable<Lead> query = _leads
.Include(search => search.Patient)
.Include(search => search.Calendar);
//var nameOrigins = (from o in _leads
// group o by new { o.Origin} into grp
// select new Lead { Origin = grp.Sum(s => s.Origin)}).ToListAsync();
//var nameOrigins = from o in _leads.Cast<string>()
// group o by o into g
// select new { Lead = g.Key, Count = g.Count() };
var nameOrigins = await _leads.CountAsync(lead => lead.Created >= firstDayOfMonth && lead.Created <= lastDayOfMonth && lead.Origin)
.Where(g => g.Count() > 1)
.Select(g => g.Key);
//var originsCount =
//(nameOrigins.Count() > 0)
return nameOrigins;
}
}
The excerpts that are commented was the way I tried to do and I could not actually perform the query that searches the number of names repeated in the Origin column in a certain period of each month.
Example:
In the month of Janeiro
was registered
10 - Joao
5 - Maria
2 - Jose
Fevereiro
20 - Maria
15 - Jose
3 - Joao
It would not be the case to group and count?
– Leandro Angelo
It would be the case to search in the database the records of a specific column within the table, and see the amount of record with the same name.
– J. Moura