public static IQueryable<T> FilterExact<T>(this IQueryable<T> details, int c, Func<T, int> lambda)
{
if (c > 0)
{
details = details.Where(s => lambda(s).Equals(c));
}
return details;
}
以上就是我到目前为止所做的。由于linq到实体错误而存在当前错误,可以通过将其切换到IEnumerable来修复,但相反,我想要的是能够创建新的linq表达式,而不是直接执行函数。
我该怎么做呢?我希望从Func<T, int>
映射到Expression<Func<T, bool>>
。
我需要这个的原因是因为有一些地方存在如下代码,除了相同的代码被复制粘贴多次与不同的实体列相关联。我想将其创建为防止代码重复的方法,但需要一种方法来指定要使用的列。 (我首先尝试过反射,但它显着降低了一切。)
if (!string.IsNullOrEmpty(searchCriteria.StudyDate))
{
if (searchCriteria.StudyDate.Contains(":"))
{
string[] dates = searchCriteria.StudyDate.Split(':');
DateTime startDate;
DateTime endDate;
DateTime.TryParse(dates[0], out startDate);
DateTime.TryParse(dates[1], out endDate);
if (startDate.Year > 1 && endDate.Year > 1 && endDate > startDate)
{
dropChargesStudies = dropChargesStudies.Where(s => s.PERFORMED >= startDate && s.PERFORMED <= endDate);
}
else
{
throw new Exception("The study date is invalid.");
}
}
else
{
DateTime studyDateParsed;
DateTime.TryParse(searchCriteria.StudyDate, out studyDateParsed);
if (studyDateParsed.Year > 1)
{
dropChargesStudies = dropChargesStudies.Where(s => s.PERFORMED.Value == studyDateParsed);
}
else
{
throw new Exception("The study date is invalid.");
}
}
}