C# - How to find most frequent date from list - c#

I seem to have drawn a blank. I have a list of sales, retrieved like so:
List<Sales> sales = ctn.Sales.Where(s => s.DateSold >= request.FromDate && s.DateSold <= request.ToDate).ToList();
An item in the list of sales would look something like the following:
SaleID | DateSold | ProductID | ShopID
As part of a report, I would like to return to the user a simple string informing them of what day is the day that tends to sell the most.
So I think what I should do is group sales by day, get a count for each day, and then evaluate which has the highest number, however I'm not sure exactly how to do this.
Can anyone help?

You just have to group on the DateSold and then order by the count (which tells you how many items belong to the group):
salesByDay = sales.GroupBy(s => s.DateSold).OrderBy(g => g.Count());

If you set the exact DateTime of sold item into DateSold, you probably want to take Date part and group by it
from sale in sales
group sale by sale.DateSold.Date into grouped
orderby grouped.Count()
select new {Date = grouped.Key, Count = grouped.Count()};

This will provide you the date with the most sales:
sales.GroupBy(x => x.DateSold).OrderByDescending(g => g.Count()).FirstOrDefault().Key;

Related

Linq Find the most recurring record

I have a rent a car project.
This is the table where I keep the rented vehicles
I want to find the most rented vehicle in this table. How can I do this?
So I want to find the most mentioned car Id in the table
[I have to do it with context architecture. How can I do this with c # linq?]2
I want to find the most rented vehicle in this table.
So basically you want to find out how many times car 5 is rented, and how many times car 6 is rented, etc, and keep the carId with the highest rental count.
As you are working with a database, my advice would be to use GroupBy to make groups of rentals that have the same CarId, and then keep the group that has the most number of rentals = order by descending count and take the first.
We'll use the overload of Queryable.GroupBy that has a parameter resultSelector, so we can select the number of rentals in the group as result.
// make groups of CarRentals that have the same CarId:
var mostRentedCarId = dbContext.CarRentals.GroupBy(carRental => carRental.CarId,
// parameter resultSelector: for every CarId and all CarRentals that have this CarId,
// make one new object
(carId, carRentalsWithThisCarId) => new
{
CarId = carId,
RentalCount = carRentalsWithThisCarId.Count(),
})
// order the groupBy result by descending rentalCount and take the first or default:
.OrderByDescending(groupByResult => groupByResult.RentalCount)
.FirstOrDefault();
if you mean that you want to find the sql query string for that question u can use the count() to count how many times the id of a specific car is repeated. And since you want the most rented car you can use somthing like this:select top 1 count(CarId) from tableName group by CarId order by count(CarId) desc
this should work for you.
You could write a query like the below, or use the approach as suggested by Abdelghafour Lahrache.
SELECT MAX(CarCount)
FROM
(
SELECT COUNT(CarId) AS CarCount
FROM YourTableName
GROUP BY CarId
) CarIdCounter

Trying to get accounts that owe for a particular month in my estate management project

I am new to C# and SQL. I would love to get help on how to get just the accounts of those owing for a particular month. The query should not include those that have paid for that same month and not owing. For instance, for the month of February, James, John and Samuel paid and for the month of March only Samuel paid.
This is the code I wrote, but it is still returning those that are not owing. It still returns Samuel as a debtor despite he is the only one not owing for March.
SELECT *
FROM tblPayment
WHERE NOT (#fmonth > MONTH( DateCreated)
AND #fyear > YEAR( DateCreated))
AND NOT (#tmonth <= MONTH( DateCreated)
AND #tyear <= YEAR( DateCreated))
ORDER BY Id DESC
How do I get just James and John without repeating Samuel? Thanks.
To get the list of people who haven't made a payment, you will need access to a list of potential people who need to pay. In this example below I've assumed you have an accounts receivable table with the names of people who need to pay.
This example uses a correlated subquery and an existence clause to only return names and accounts from the accounts receivable table where that account doesn't have a payment record during the month in question.
In a real application account receivable logic would need to be more complicated because accounts can pay ahead and go negative, but I think this works as a simple example.
SELECT AR.name, AR.AccountNumber
FROM AccountsReceivable AR
WHERE NOT EXISTS (SELECT *
FROM tblPayment p
WHERE MONTH(DateCreated) = #month
AND YEAR(DateCreated) = #year
AND p.AccountNumber = AR.AccountNumber)
It might be possible to get the answer you are looking for by only querying tblPayment, but that makes the assumption that people that haven't paid have a zero value or null entry with their name and you haven't given us enough information in your question to make those assumptions.
Well,
Assuming you have the accounts in one table and the payments in another (tblPayment) you could select only the account Ids that are not present in the payments table for a particular month (in this example, for March) by applying the following query (sample data are in array of objects but the query can be applied to database tables, as is):
var accounts = new [] {
new { Id=1, Name="James" },
new { Id=2, Name="John" },
new { Id=3, Name="Samuel" }
};
var tblPayment = new [] {
new { Month=2, AccountId=1 },
new { Month=2, AccountId=2 },
new { Month=2, AccountId=3 },
new { Month=3, AccountId=3 }
};
// James and John for March - Empty for February
var debtors_march = accounts
.Where(a => !tblPayment.Where(p => p.Month == 3)
.Any(p => p.AccountId == a.Id));

How write query for getting last 3 months records in linq to sql?

I want to display last 3 months sales records.Based on current month will show it's previous records in linq to sql.Please tell me the query for that.
If current month is june then will show apr,may,june records.
id name no.ofsales desc datevalue
1 test 12 test desc 2013-10-12
2 test1 16 desc message 2013-09-14
Give me idea on this query.
var minDate = DateTime.Now.AddMonths(-3);
from x in datatable
where x.datevalue> minDate
select x;
I think something like this could work:
yourCollection.Where(x =>
DateTime.Compare(x.DateTimeProperty, DateTime.Today.AddMonths(-3)) >= 0);
from x in datatable
where x.datevalue> DateTime.Now.AddMonths(-3)
orderby x.id ascending
select x;

Filter week from list of dates

I have a list of dates, how can I select a week from it?
Suppose this is the list of dates:
02/11/2012
11/25/2012
04/08/2012
12/03/2012
04/13/2012
04/11/2012
12/12/2012
01/25/2012
04/10/2012
04/12/2012
04/09/2012
05/23/2012
10/05/2012
01/25/2012
04/14/2012
The extracted week should be like this:
04/08/2012
04/09/2012
04/10/2012
04/11/2012
04/12/2012
04/13/2012
04/14/2012
Edit:
I have a table in the DB that contains dates, I need when I fetch all records, to filter the data according to these dates and view them in weeks.
If I understood right you want to group dates from your list in a way, that dates from the same week would be in the same group. I think it should be done this way:
var dates = (..) // your list of dates
var dtf = DateTimeFormatInfo.CurrentInfo;
var groupedDates = dates.GroupBy(d => dtf.Calendar.GetWeekOfYear(d, dtf.CalendarWeekRule, dtf.FirstDayOfWeek));
After that you'll be able to select dates from chosen week:
var myWeekDates = groupedDates.SingleOrDefault(g => g.Key == myWeekNr);
or simply iterate through all groups:
foreach(var g in groupedDates)
{
// (...)
// g.Key is #nr of the week
// g is IEnumerable<DateTime> with dates within that week
}
How are you selecting these records from the database?
Maybe you can handle it in SQL:
SELECT DATEPART(WK, date_column) FROM table;
It returns the week number of the date so you can either get the first day or last day of that week.

How do i get the top 5 items in a database based on the occurence of a particluar field?

Using Ado.Net Entity framework, I am trying to get the 'top 3' items in a table based on the amount of times they appear in a table.
For example:
Table:
basket_to_product_id | basket_id | product_id
I want to see how many times product_id occurs, and would like to return the top 3 product_ids that occur the most frequently.
I'm stuck at:
List<BasketToProduct> btplist = entities.BasketToProduct. ..........?
Something like this should work (of course I do not know the actual names of your properties):
IEnumerable<int> top3ProductIds = (from btp in entities.BasketToProduct
group btp by btp.ProductId into g
orderby g.Count() descending
select g.Key).Take(3);
You could try to use a LINQ query on the table.
Try this:
var query = entities.BasketToProduct
.GroupBy(btp => btp.ProductID)
.Select(g => ProductID = g.Key, Count = g.Count())
.OrderBy(g => g.Count)
.Take(3);
It'll get you the top three ProductIDs and their associated counts.

Categories