【问题标题】:Entity Framework / LINQ / .NET - Perform 'LIKE' on DateEntity Framework / LINQ / .NET - 在日期执行“LIKE”
【发布时间】:2014-02-06 20:38:54
【问题描述】:

有没有办法使用 LINQ / .NET 在 Date 上执行“LIKE”?我正在尝试对允许用户查找时间的自动完成框进行操作。

        Function GetTimesAvailable(term As String) As ActionResult
        Using db As New Context
            Dim vals = db.CalendarSlots.Where(Function(c) c.TimeStart.ToString.Contains(term)).Select(Function(c) c.TimeStart).ToList
            Return Json(vals, JsonRequestBehavior.AllowGet)
        End Using

    End Function

此代码不起作用: LINQ to Entities 无法识别方法“System.String ToString()”方法,并且该方法无法转换为存储表达式。

【问题讨论】:

  • 您到底为什么要这样做?日期是序数类型,如果你只使用范围,你会更容易编码并且最终得到更有效的查询。
  • 我想要它,因为这是销售团队想要的页面。我检查了规范,不需要有效的查询。他们也不想要范围。
  • 呃,你不要问销售人员,因为他们不知道他们在说什么。我们在这里谈论的是完全相同的结果,只是没有可怕的混乱。他们不需要输入范围,但you仍然使用范围查询来自动完成。没有冒犯,但“不需要高效查询”这句话是我听过的最不专业的说法之一。
  • 您能否添加一个示例来执行您建议的范围查询?老实说,我不知道如何使范围查询看起来像自动完成。我没有被你的说法冒犯,但我很困扰你似乎表明你有一个你没有分享的解决方案。
  • 附带说明,VB.NET 实际上有一个Like 运算符:msdn.microsoft.com/en-us/library/swf8kaxw.aspx

标签: .net entity-framework linq


【解决方案1】:
<Extension>
Private Function ContainsSplit(source As String, toCheck As String, comp As StringComparison)
    Dim sp = toCheck.Split(" ")

    For Each s In sp
        If source.IndexOf(s, comp) < 0 Then
            Return False
        End If
    Next

    Return True
End Function

<Extension>
Public Function GetTimesAvailable(ByVal Context As Context, term As String) As IEnumerable(Of String)
    Using db As New Context
        Dim query1 = From c In db.CalendarSlots
                     Group c By c.TimeStart Into TimeStartGroup = Count()
                    Select TimeStart

        Dim times = query1.ToList

        Dim timesAsString = From t In times
                            Select TimeStart = t.ToLongDateString & " " & t.ToLongTimeString

        Dim times2 = timesAsString.ToList

        Dim query2 = From t In times2
                Where t.ContainsSplit(term, StringComparison.OrdinalIgnoreCase)
                Select t
        Return query2.ToList
    End Using
End Function

我希望有一种方法可以在服务器端删除包含。我能想到的唯一方法是使用 .toList 实现查询,然后执行包含。

【讨论】:

  • 这就是答案吗?您没有提供任何实际文本。
  • @Gabe - 他不会回答你,他没有 SO 帐户,它是从 Programmers.SE 迁移而来的
  • 这是一个答案。我希望有一个更好的答案,它可以做同样的事情,但可以在实现数据之前过滤数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
相关资源
最近更新 更多