【问题标题】:Linq to SQL Date conversion errorLinq 到 SQL 日期转换错误
【发布时间】:2017-12-11 16:51:30
【问题描述】:

我正在尝试在可选日期字段上过滤 Linq to SQL 查询,但遇到了问题。方法如下:

public List<ReferralTrackerModel> GetDoctorDailySchedule(int DBID, int DoctorCode, string apptDateFrom, string apptDateTo)
    {
        using (var dbIMEC = getISSDataContext(DBID))
        {
            var eResults = from c in dbIMEC.tblCases
                           join s in dbIMEC.tblServices on c.ServiceCode equals s.ServiceCode
                           join e in dbIMEC.tblExaminees on c.ChartNbr equals e.ChartNbr
                           join p in dbIMEC.tblPublishOnWebs on c.CaseNbr equals p.TableKey
                           join ct in dbIMEC.tblCaseTypes on c.CaseType equals ct.Code
                           join l in dbIMEC.tblLocations on c.DoctorLocation equals l.LocationCode.ToString()
                           where p.UserCode == DoctorCode
                           where p.TableType == "tblCase"
                           where p.PublishOnWeb
                           where p.TableKey == c.CaseNbr
                           where p.UserType == "DR"
                           //where c.ApptDate >= DateTime.Parse(apptDateFrom)
                           //where c.ApptDate <= DateTime.Parse(apptDateFrom).Date.AddHours(23).AddMinutes(59).AddSeconds(59)
                           select new ReferralTrackerModel()
                           {
                               CaseNbr = c.CaseNbr,
                               ClaimNbr = c.ClaimNbr.Trim(),
                               ExamLocationName = l.Location.Trim(),
                               ExamineeName = e.LastName.Trim() + ", " + e.FirstName.Trim(),
                               CaseType = ct.Description.Trim(),
                               ServiceDesc = s.Description.Trim(),
                               ApptDateTime = c.ApptTime.ToString().Trim(),
                               ApptDateTimeDate = DateTime.Parse(c.ApptTime.ToString())
                           };

            if (apptDateTo.Length > 0)
            {
                var dateTo = DateTime.Parse(apptDateTo);
                eResults = eResults.Where(r => r.ApptDateTimeDate <= dateTo);
            }

            var lst = eResults.ToList();

            return lst;
        }
    }

      The date calculation in the main part of the query is working as expected but the portion after the if statement is not. I am getting the following error back from the API controller:

“消息”:“方法 'System.DateTime Parse(System.String)' 没有支持的 SQL 转换。”

我的目的是在存在可选的 apptDateTo 字段时过滤结果。

【问题讨论】:

    标签: c# sql linq asp.net-web-api


    【解决方案1】:

    DateTime.Parse 的结果存储到一个变量中并使用它。

            if (apptDateTo.Length > 0)
            {
                var parsedDate = DateTime.Parse(apptDateTo);
                eResults = eResults.Where(r => r.ApptDateTimeDate <= parsedDate);
            }
    

    问题在于 LINQ to SQL 正试图将 DateTime.Parse 调用转换为 SQL 中的某些内容,但它不知道该怎么做。这会阻止 LINQ to SQL 尝试。

    【讨论】:

    • 这是因为在查询的选择部分您将ApptDateTimeDate 定义为DateTime.Parse(c.ApptTime.ToString())。因此,在那个可选的 where 子句中,它用 parse 调用替换了该字段。并且循环回到DateTime.Parse 没有适当地转换为 SQL,因此您得到了错误。 ApptTime 是数据库中的字符串还是其他类型?如果它是一个字符串,你就有点搞砸了,你必须要么放弃 LINQ to SQL 而使用手写 SQL,要么先把所有数据带回来,然后用日期过滤。如果是日期,请改用它。
    【解决方案2】:

    LINQ 表达式以及在具体化到内存之前添加到表达式树的任何内容都必须可转换为支持数据存储的查询。在这种情况下,SQL。而且SQL确实没有DateTime.Parse()的翻译。

    首先解析值,完全在 C# 代码中,与 LINQ 查询无关,然后使用结果查询数据:

    if (apptDateTo.Length > 0)
    {
        var dateTo = DateTime.Parse(apptDateTo);
        eResults = eResults.Where(r => r.ApptDateTimeDate <= dateTo);
    }
    

    编辑:我注意到您还在整个 LINQ 代码的其他几个地方使用了DateTime.Parse()。例如:

    where c.ApptDate >= DateTime.Parse(apptDateFrom)
    

    同样的原则也适用于那里。您不能使用 LINQ 中的后备数据存储不支持的操作。先解析值,然后在查询中使用。

    【讨论】:

    • 我之前尝试过,但仍然遇到同样的错误。我试过你的代码,我仍然得到错误。感谢您的回答。
    • @CrystalLake62:我刚刚更新了答案。看起来您在整个 LINQ 代码中 多次 使用了 DateTime.Parse()。相同的解决方案适用,并且需要在您使用它的任何地方应用。
    • 奇怪的是,即使使用日期时间转换,查询的上部也能正常工作。条件部分仍然有问题。
    • @CrystalLake62:定义“按需要工作”。这段代码所做的大部分工作就是定义一个查询。在您尝试执行查询之前,我不希望发生错误,该查询位于代码的后面。您只需要从您的 LINQ 代码中删除所有使用 DateTime.Parse()(当然还有其他任何会产生类似错误的内容)。
    • 我在主查询中注释掉了转换以防万一,但我仍然遇到同样的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多