LINQ没有返回正确的数据行

时间:2015-09-03 15:20:47

标签: c# linq

这是我的全套数据,突出显示的行应该由我的查询返回,但不返回任何数据。

http://screencast.com/t/S0DgVgIuQS

而linq就像这样

if (filtro.Equals("Pendientes"))
{
     var activididadesFiltradas = actividades
               .Where(p => (Convert.ToDateTime(p.fechaVencimiento) >= DateTime.Today) 
                   && (Convert.ToDateTime(p.fechaVencimiento) <= DateTime.Today.AddDays(7)) 
                   && (p.estado != "Documentada")).ToList();
     return activididadesFiltradas;
} 

基本上它应该返回fechavencimiento在今天和未来7天之间的数据,并且estado与Documentada不同,如果你看到屏幕截图,条件就满足了。

btw,数据集的日期是字符串,所以我必须在比较之前转换它们

Upodate1

我也试过这个但没有结果

var present = DateTime.Today;
                    var future = DateTime.Today.AddDays(7);
                    var validIDs = actividades
                            .Select(s => new
                            {
                                id = s.ID,
                                filter = s.fechaVencimiento,
                                date = Convert.ToDateTime(s.fechaVencimiento, CultureInfo.InvariantCulture ),
                                present = new DateTime(present.Year, present.Month, present.Day),
                                future = new DateTime(future.Year, future.Month, future.Day)
                            })
                            .Where(m => (m.date - m.present).TotalDays >= 0 && (m.future - m.date).TotalDays >= 0 && !m.filter.Equals("Documentada"))
                            .Select(s => s.id);

                    var activididadesFiltradas = actividades.Where(a => validIDs.Contains(a.ID)).ToList();

更新2

这是应该返回的记录:

http://screencast.com/t/1SUjRV2rVGa

2 个答案:

答案 0 :(得分:2)

`"(Convert.ToDateTime(p.fechaVencimiento) >= DateTime.Today)"`

7/09/2015今天肯定不是>=MM/dd/yyyy)格式

答案 1 :(得分:1)

您的比较不会考虑时间成分。即使您的日期被正确解析,如果它在字符串表示中不包含时间元素,您最终可能会遇到日期为2015/01/01 00:00:00:000和&# 39;今天&#39;是2015/01/01 03:12:56:001看到您只对几天感兴趣,我建议您正常化&#39;首先是你的日期,然后根据结果过滤。

可能是这样的:

    var format = "dd/MM/yyyy";

    var present = DateTime.ParseExact (DateTime.Today.ToString(format, CultureInfo.InvariantCulture), format, CultureInfo.InvariantCulture);
    var future = DateTime.ParseExact (DateTime.Today.AddDays (7).ToString(format, CultureInfo.InvariantCulture), format, CultureInfo.InvariantCulture);

    var activididadesFiltradas = actividades
        .Where(p => ((DateTime.ParseExact(p.fechaVencimiento, format, CultureInfo.InvariantCulture) - present).TotalDays >= 0)
            && (future - DateTime.ParseExact(p.fechaVencimiento, format, CultureInfo.InvariantCulture)).TotalDays >= 0
            && (p.estado != "Documentada")).ToList();

    return activididadesFiltradas;