Rob
Rob

Reputation: 193

Loop through a foreach and grab each date item LINQ

I have MVC 5 C# web API. I am going to display delivery days calculation according to system date. My code is working for single sub region with post code for the delivery day display (same post code has may sub regions). Can anyone please help me

This is my delivery details screen.

enter image description here

This is my C# code

int weeklyLogic = 0;
DateTime Firstweek = new DateTime();
DateTime cutDayFirst = new DateTime();

foreach (var delivery in day)
{

 weeklyLogic = ((int)Enum.Parse(typeof(DayOfWeek), delivery.DeliveryDay) - (int)today.DayOfWeek + 7) % 7;
   var nextweeklyLogic = today.AddDays(weeklyLogic);
   Firstweek = nextweeklyLogic;
   var cutDayLogic = nextweeklyLogic.AddDays(-delivery.CloseDayId);
   cutDayFirst = cutDayLogic;                 
 
}

var Location = (from su in db.Suburbs.AsEnumerable()
                                 where su.postcode.Contains(pcode) &&
                                 su.name.Contains(SuburbName)
                                 join sur in db.SubRegions on
                                 su.SubRegionID equals sur.SubregionID
                                 join re in db.AuRegions on
                                 sur.RegionID equals re.RegionID
                                 join DT in db.DeliveryPeriods on
                                 sur.DeliveryTimeId equals DT.Id
                                 select new Posts
                                 {
                                     suburb = new Suburb()

                                     {
                                         name = su.name,
                                         postcode = su.postcode,
                                       
                                     },
                                     region = new Region()
                                     {
                                         Name = re.Name
                                     },

                                     deliveryTime = new DeliveryTime()
                                     {

                                         DeliveryDay = DT.DeliveryDay,
                                         DeliveryType = DT.DeliveryType,

                                     },

                                     subRegion = new SubRegion()
                                     {
                                         CloseDayId = sur.CloseDayId,
                                         SubregionName = sur.SubregionName,
                                         SubregionID = sur.SubregionID
                                     },
                                     deliveryDays = new DeliveryDays() 
                                     {
                                       
                                        Firstweek = Firstweek,
                                        cutDayFirst = cutDayFirst,
                                     },
                                   }).ToList();
                return Location1.Select(l => new LocationDTO

                {
                    DeliveryDay = l.deliveryTime.DeliveryDay,
                    PostCode = l.suburb.postcode,
                    CloseDayId = l.subRegion.CloseDayId,
                    SubregionID = l.subRegion.SubregionID,
                    TFirstDeliveryDay = l.deliveryDays.Firstweek.ToString("dddd, d MMMM yyyy"),
                    TFirstCutOffDay = l.deliveryDays.cutDayFirst.ToString("dddd, d MMMM yyyy"),
          
                }).ToList();
	

This is my out put, I marked errors. enter image description here

Upvotes: 1

Views: 660

Answers (1)

Viplock
Viplock

Reputation: 3319

As i can see your logic is incorrect by foreach loop. as per your for each

     int weeklyLogic = 0;
     DateTime Firstweek = new DateTime();
     DateTime cutDayFirst = new DateTime();

    foreach (var delivery in day)
    {

      weeklyLogic = ((int)Enum.Parse(typeof(DayOfWeek), delivery.DeliveryDay) - (int)today.DayOfWeek + 7) % 7;
      var nextweeklyLogic = today.AddDays(weeklyLogic);
      //initiated for all further processing by last value of day 
      Firstweek = nextweeklyLogic;
     //initiated for all further processing by last value of day

      var cutDayLogic = nextweeklyLogic.AddDays(-delivery.CloseDayId);
      cutDayFirst = cutDayLogic;                 

    }

by above logic Firstweek ,cutDayFirst always be the last one set by the foreach loop and these value will be same for all the Location .

your entire location logic should be inside foreach.

Update

create a new class

public class calculatedDays
{

    public int SubRegionID{ get; set; }
    public DateTime Firstweekdate { get; set; }
    public DateTime cutDayFirstdate { get; set; }
}

and by your for each logic do this.

    int weeklyLogic = 0;
    DateTime Firstweek = new DateTime();
    DateTime cutDayFirst = new DateTime();
    List<calculatedDays>Days=new List<calculatedDays>();
   foreach (var delivery in day)
   {

   weeklyLogic = ((int)Enum.Parse(typeof(DayOfWeek), delivery.DeliveryDay) - (int)today.DayOfWeek + 7) % 7;
     var nextweeklyLogic = today.AddDays(weeklyLogic);
     Firstweek = nextweeklyLogic;
    var cutDayLogic = nextweeklyLogic.AddDays(-delivery.CloseDayId);
    cutDayFirst = cutDayLogic;        


    calculatedDays d= new calculatedDays();
    d.SubRegionID=delivery.SubRegionID;
    d.Firstweekdate =Firstweek ;
    d.cutDayFirstdate =cutDayFirst ;
    Days.add(d);
  }

for your location calculation add these changes.

    var Location = (from su in db.Suburbs.AsEnumerable()
                             where su.postcode.Contains(pcode) &&
                             su.name.Contains(SuburbName)
                             join sur in db.SubRegions on
                             su.SubRegionID equals sur.SubregionID
                             join re in db.AuRegions on
                             sur.RegionID equals re.RegionID
                             join DT in db.DeliveryPeriods on
                             sur.DeliveryTimeId equals DT.Id
                             join dts in Days on
                             su.SubRegionID equals dts.SubRegionID 
                             select new Posts
                             {
                                 suburb = new Suburb()

                                 {
                                     name = su.name,
                                     postcode = su.postcode,

                                 },
                                 region = new Region()
                                 {
                                     Name = re.Name
                                 },

                                 deliveryTime = new DeliveryTime()
                                 {

                                     DeliveryDay = DT.DeliveryDay,
                                     DeliveryType = DT.DeliveryType,

                                 },

                                 subRegion = new SubRegion()
                                 {
                                     CloseDayId = sur.CloseDayId,
                                     SubregionName = sur.SubregionName,
                                     SubregionID = sur.SubregionID
                                 },
                                 deliveryDays = new DeliveryDays() 
                                 {

                                    Firstweek = dts.Firstweekdate ,
                                    cutDayFirst = dts.cutDayFirstdate,
                                 },
                               }).ToList();
            return Location1.Select(l => new LocationDTO

            {
                DeliveryDay = l.deliveryTime.DeliveryDay,
                PostCode = l.suburb.postcode,
                CloseDayId = l.subRegion.CloseDayId,
                SubregionID = l.subRegion.SubregionID,
                TFirstDeliveryDay = l.deliveryDays.Firstweek.ToString("dddd, d MMMM yyyy"),
                TFirstCutOffDay = l.deliveryDays.cutDayFirst.ToString("dddd, d MMMM yyyy"),

            }).ToList();

Hope it will help you . thanks. :)

Upvotes: 1

Related Questions