我必须过滤掉日期范围内有效的记录。 这些日期列是数据库中的字符串('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...
}
答案 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();