[英]Filtering a LINQ query by DateTime causing System.NotSupportedException Error
我有一个包含中学调查列表的数据库表。 我有一个控制器,它显示数据库表中的条目列表。 我试图允许用户在“dd-MM-yyyy”日期搜索特定的调查条目。
我尝试了以下操作,尽管当我搜索日期时返回 View(surveys.ToPagedList(pagerNumber, pageSize)) 会引发以下错误:
System.NotSupportedException: 'LINQ to Entities 无法识别方法 'System.String ToString(System.String)' 方法,并且此方法无法转换为存储表达式。
我的索引控制器:
// GET: SecondarySchoolSurvey
public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
//paging
if (searchString != null)
{
page = 1;
}
else
{
searchString = currentFilter;
}
ViewBag.CurrentFilter = searchString;
var surveys = from s in db.SecondarySchoolSurveys
select s;
if (!String.IsNullOrEmpty(searchString))
{
surveys = db.SecondarySchoolSurveys.Where(s => s.OfficialSchoolName.Contains(searchString) || s.RollNumber.Contains(searchString) || s.CampDate.Value.ToString("dd/MM/yyyy").Contains(searchString));
}
switch (sortOrder)
{
case "name_desc":
surveys = surveys.OrderByDescending(s => s.OfficialSchoolName);
break;
default:
surveys = surveys.OrderBy(s => s.OfficialSchoolName);
break;
}
int pageSize = 10;
int pageNumber = (page ?? 1);
return View(surveys.ToPagedList(pageNumber, pageSize));
}
我可能会使用 SqlFunctions 类,即 SqlFunctions.StringConvert 但是我如何将 DateTime 转换为正确的格式 (dd-MM-yyyy)?
我也尝试将搜索字符串转换为 DateTime,尽管一直收到 Sys.FormatException:“该字符串未被识别为有效的 DateTime”。
DateTime dt = DateTime.Parse("dd-MM-yyyy", CultureInfo.InvariantCulture);
if (!String.IsNullOrEmpty(searchString))
{
surveys = db.SecondarySchoolSurveys.Where(s => s.OfficialSchoolName.Contains(searchString) || s.RollNumber.Contains(searchString) || s.CampDate == dt);
}
如果我理解你可以使用DateTime.TryParse
的问题
将日期和时间的指定字符串表示形式转换为其等效的 DateTime,并返回一个指示转换是否成功的值。
// Read the documentation on TryParse
var isDate = DateTime.TryParse(searchString, out var searchDate);
// the assumption is if it's a date,
// then it's not going to satisfy any other search requirements
if (isDate)
{
// note, I use .Date as it's likely you don't want to compare time as well
surveys = db.SecondarySchoolSurveys
.Where(s => s.CampDate.Date = searchDate.Date);
}
else if (!String.IsNullOrEmpty(searchString))
{
surveys = db.SecondarySchoolSurveys
.Where(s =>
s.OfficialSchoolName.Contains(searchString) ||
s.RollNumber.Contains(searchString))
}
注意:还有其他方法可以做到这一点,您可以在一个查询中全部完成,尽管我认为这是明确的并且易于理解
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.