I am using LINQ query in my code which need to be write multiple times with small changes in where condition. My query is

```
var sdata = from r in dt.AsEnumerable()
where r.Field<DateTime>("DAT_START").TimeOfDay.Hours < 20 &&
          r.Field<DateTime>("DAT_START").TimeOfDay.Hours >= 4
    group r by r["TXT_TARGET_CELL_ID"] into g
    select new
    {          

        CellID = g.Key,
        TotalCommCount = g.Count(),
        TotalDuration = g.Sum(r => r.Field<int>("LNG_DURATION")),
        InSMSCount = g.Count(r => r.Field<Int16>("INT_DIRECTION") == 1 &&
                                  r.Field<Int16>("INT_CALL_DATA_TYPE") == 5),
        OutSMSCount = g.Count(r => r.Field<Int16>("INT_DIRECTION") == 2 &&
                                   r.Field<Int16>("INT_CALL_DATA_TYPE") == 5),
        InVoiceCount = g.Count(r => r.Field<Int16>("INT_DIRECTION") == 1 &&
                                    r.Field<Int16>("INT_CALL_DATA_TYPE") == 1),
        OutVoiceCount = g.Count(r => r.Field<Int16>("INT_DIRECTION") == 2 &&
                                     r.Field<Int16>("INT_CALL_DATA_TYPE") == 1),
        InVoiceDuration = g.Where(r => r.Field<Int16>("INT_DIRECTION") == 1 &&
                                    r.Field<Int16>("INT_CALL_DATA_TYPE") == 1)
                           .Sum(r => r.Field<int>("lNG_DURATION")),
        OutVoiceDuration = g.Where(r => r.Field<Int16>("INT_DIRECTION") == 2 &&
                                        r.Field<Int16>("INT_CALL_DATA_TYPE") == 1)
                           .Sum(r => r.Field<int>("LNG_DURATION")),
        Latitude = g.Any(s => s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS") != null && s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS").Trim() != "") ? g.First(s => s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS") != null && s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS").Trim() != "").Field<string>("TXT_LATITUDE") : "",
        Longitude = g.Any(s => s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS") != null && s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS").Trim() != "") ? g.First(s => s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS") != null && s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS").Trim() != "").Field<string>("TXT_LONGITUDE") : "",
        BTS_Address = g.Any(s => s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS") != null && s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS").Trim() != "") ? g.First(s => s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS") != null && s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS").Trim() != "").Field<string>("TXT_TARGET_BTS_LOCATION_ADDRESS") : "",
        Azimuth = g.Any(s => s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS") != null && s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS").Trim() != "") ? g.First(s => s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS") != null && s.Field<string>
                        ("TXT_TARGET_BTS_LOCATION_ADDRESS").Trim() != "").Field<string>("TXT_AZIMUTH_DEG") : ""

    } into summary
orderby summary.TotalCommCount descending
select summary;

```

Here i need to change where condition only every time, remaining part remain same i.e Select new part. Can i write this query once in code and make a call to it with change in where condition ?