Asp.net LINQ to实体无法识别其中的方法调用

Asp.net LINQ to实体无法识别其中的方法调用,asp.net,asp.net-mvc,linq,Asp.net,Asp.net Mvc,Linq,我完全理解这是因为LINQ查询需要将整个表达式转换为服务器,因此我无法在其中调用外部方法。但正如我看到的其他答案一样,并没有相对的解决方案。我考虑的唯一方法是循环遍历模型中的所有项,然后将它们逐个传递给查询,但即使这种方法没有帮助,因此我在这里向任何人寻求帮助,以帮助我了解如何调用方法或调用方法appendstr的方法,该方法在检查之前初始化a.PostedDate它在给定LINQ查询中的实际等效值 [HttpGet] public ActionResult SearchResult(int?

我完全理解这是因为LINQ查询需要将整个表达式转换为服务器,因此我无法在其中调用外部方法。但正如我看到的其他答案一样,并没有相对的解决方案。我考虑的唯一方法是循环遍历模型中的所有项,然后将它们逐个传递给查询,但即使这种方法没有帮助,因此我在这里向任何人寻求帮助,以帮助我了解如何调用方法或调用方法appendstr的方法,该方法在检查之前初始化a.PostedDate它在给定LINQ查询中的实际等效值

[HttpGet]
public ActionResult SearchResult(int? page, string searchTitle = null, string searchLocation = null, string last24 = "")
{


    ViewBag.searchTitle = searchTitle;
    ViewBag.searchLocation = searchLocation;
    ViewBag.page = page;
    ViewBag.last24 = last24;

    setUpApi(searchTitle, searchLocation);
    var result = new List<AllJobModel>().AsQueryable();
    if (!string.IsNullOrEmpty(ViewBag.searchTitle) || !string.IsNullOrEmpty(ViewBag.searchTitle) || !string.IsNullOrEmpty(ViewBag.last24))
    {
        setUpApi(searchTitle, searchLocation);
        DateTime now = DateTime.Now;

        result = db.AllJobModel.Where(a => a.JobTitle.Contains(searchTitle) && a.locationName.Contains(searchLocation) &&
        appendstr(a.PostedDate).Equals(now.AddHours(-24).ToString("MM-dd-yyyy")));
    }
    else
    {
        result = from app in db.AllJobModel select app;
    }


    return View(result.ToList().ToPagedList(page ?? 1, 5));
}

我想您已经理解了,您在Where子句中编写的.NET代码实际上是一个经过解析并转换为SQL的表达式。所以,如果你有一个时髦的字符串操作方法,你不能直接使用它

蛮力选项,正如您似乎已经理解的,它需要首先具体化查询,然后在结果上运行C代码。您可以使用ToList或AsEnumerable执行此操作

但是,在您的具体情况下,您可以尝试一个技巧。您正在尝试进行日期比较,SQL完全能够做到这一点。。。您只需要将那个时髦的PostedDate转换为SQL DateTime,以便可以直接进行比较。其技巧是使用SqlFunctions.DateAdd添加空间隔,例如0天。这会隐式地将字符串转换为DateTime,您现在可以在SQL端查询:

var targetDate = DateTime.Now.AddHours(-24);
result = db.AllJobModel
    .Where
    (
        a => a.JobTitle.Contains(searchTitle)
          && a.LocationName.Contains(searchLocation)
          && SqlFunctions.DateAdd("DAY", 0, a.PostedDate) == targetDate
    );

解决方法的功劳归到了。

您想用这个附录A.PostedDate.Equalsnow.AddHours-24.ToString-D-MM-yyyy做什么?邮寄日期的格式是什么?很抱歉延迟回复2020年1月30日10:23AMMM-dd-yyyy或dd-MM-yyyy?如前所述,您将保留已发布的日期和年份,并将月份强制为一月。这就是你想要的吗?
result = db.AllJobModel
    .Where
    (
        a => a.JobTitle.Contains(searchTitle)
          && a.LocationName.Contains(searchLocation)
    )
    .AsEnumerable()
    .Where
    (
        a => appendstr(a.PostedDate).Equals(now.AddHours(-24).ToString("MM-dd-yyyy")))
    );
var targetDate = DateTime.Now.AddHours(-24);
result = db.AllJobModel
    .Where
    (
        a => a.JobTitle.Contains(searchTitle)
          && a.LocationName.Contains(searchLocation)
          && SqlFunctions.DateAdd("DAY", 0, a.PostedDate) == targetDate
    );