EF查询用字符串作为日期过滤,怎么样?

时间:2015-07-09 06:53:00

标签: c# linq entity-framework

我必须过滤掉日期范围内有效的记录。 这些日期列是数据库中的字符串('JAN 01 1900','2014年5月31日')。

如何使用Entity Framework 5(EF5)使用查询方法语法过滤掉这些记录(问题是日期是字符串而不是DateTime ..)?

以下是我正在处理的代码示例:

public PostcodeEntry GetPostcodeEntry(string postcode, int huisnummer)
{
    var isEven = (huisnummer % 2) == 0; //tbv performance vd query

    using (ITransactieDataContext transactieDataContext = new TransactieDataContext())
    {
        postcodeEntry = transactieDataContext.PostcodeEntries
            .Where(p => p.Postcode.ToUpper() == postcode.ToUpper())
            .Where(p => p.NummerIsEven == isEven)
            .Where(p => p.ScheidingHoog >= huisnummer)
            .Where(p => p.ScheidingLaag <= huisnummer)
            .Where(SelectValidDateRange())
            .SingleOrDefault();

        return postcodeEntry;
    }
}

private Expression<Func<PostcodeEntry, bool>> SelectValidDateRange()
{
    DateTime now = DateTime.Now;

    return x => x.StartDate... etc...
}

4 个答案:

答案 0 :(得分:1)

您无法使用单独的方法(SelectingValidDateRange)来检查日期。但是你可以使用.NET的Convert.ToDateTime

.Where(p => Convert.ToDateTime(p.StartDate) < DateTime.Now
         && Convert.ToDateTime(p.EndDate) <= DateTime.Now)

答案 1 :(得分:1)

Convert.ToDateTime可能在直接使用实体时给出异常。 您可以先尝试获取列表中的记录,然后使用转换方法进行日期比较。

//Get complete list in postcodeEntry first
postcodeEntry = transactieDataContext.PostcodeEntries
                    .Where(p => p.Postcode.ToUpper() == postcode.ToUpper())
                    .Where(p => p.NummerIsEven == isEven)
                    .Where(p => p.ScheidingHoog >= huisnummer)
                    .Where(p => p.ScheidingLaag <= huisnummer).ToList()

//Then add Convert.ToDateTime() filter on list
var requiredResult = postcodeEntry.where(p=> Convert.ToDateTime(p.StratDate) < DateTime.Now && Convert.ToDateTime(p.EndDate) > DateTime.Now).SingleOrDefault();

希望这会有所帮助。

答案 2 :(得分:0)

Jon Skeet已经正确地提到过,作为Date的列类型应该是DateTime而不是string类型。将此列转换为DateTime并将“问题”转换为典型的源到目标转换(平面文件到SQL插入)后,我能够正确完成我的私有表达式功能。

答案 3 :(得分:0)

.Where(x =>{
string[] strDates = x.DateFieldHere.Split(",");
DateTime d1,d2;
if(DateTime.TryParse(strDates[0], out d1) 
&& DateTime.TryParse(strDates[1], out d2))
{ 
  return d1>= parameterHere1 && d2 <= parameterHere2;
}
return false; }).SingleorDefault();