【问题标题】:LINQ to SQL Equivalent of ISDATE() in T-SQL and casting?LINQ to SQL 等效于 T-SQL 和强制转换中的 ISDATE()?
【发布时间】:2009-03-03 17:21:58
【问题描述】:

有人知道 LINQ to SQL 查询语法中的 ISDATE() 等价物吗?我在 SQL 中有一个包含日期的 varchar 字段,我需要过滤掉非日期行。

希望是这样的:

var query = SomeDataContext;
    query = from p in query
    where p.ISDATE(field1) == true;
    select p;

另外,如何在 Linq 语法中为 SQL 进行转换?

CAST(SomeDate AS SMALLDATETIME)

【问题讨论】:

    标签: c# sql linq-to-sql


    【解决方案1】:

    这样做的诀窍是在数据库中创建一个用户函数,它只调用 ISDATE 作为返回值

      CREATE FUNCTION My_ISDATE(@maybeDate varchar(max))
      returns bit
      as return ISDATE(@maybeDate);
    

    然后将 My_IsDate 添加到您的数据库上下文中,并在您的查询中使用它:

    var db = SomeDataContext;
    var query = from p in db.MyTable
    where db.My_ISDATE(p.field1)
    select p;
    

    【讨论】:

    • 酷,看起来它可以工作。如何合并来自 2 个不同上下文的查询序列?通过加入表格?不同类型的?抱歉,如果这似乎是一个新手问题。我对 LINQ 相当陌生。我正在利用 LINQtoSQL 的延迟执行来构建我的查询。
    【解决方案2】:

    我认为在使用 LINQ to SQL 时没有映射到 ISDATE 的扩展方法。

    如果您可以加载所有数据,然后在客户端空间中进行过滤,则在该字段上使用 TryParse 并与日期进行比较。

    否则,我会创建一个存储过程,它会返回您想要的数据(以便您可以使用 ISDATE),然后通过上下文执行它。

    另外,您使用 ISDATE 的语法不正确。 ISDATE 只是告诉您表达式是否是有效的日期格式。您的查询将如下所示:

    var query = SomeDataContext;
        query = from p in query
        where ISDATE(field1) != 0 && CONVERT(datetime, field1) > some date
        select p;
    

    语法无效,但它让您了解如何形成查询。

    【讨论】:

    • 我可能会尝试使用 TryParse,但返回集非常大。我会看看表现如何。谢谢。
    • @steven:我真的建议你尝试SP路线,因为如果结果集很大,你会在性能上被杀死。
    【解决方案3】:
    【解决方案4】:

    SO 的一个问题是,越来越多的关于问题答案的线程包含过时的答案,主要是因为它们多年来没有被触及。然而,结合搜索引擎(例如谷歌),当您查询“我应该如何在 Linq 中使用 IsDate”时,它会以 #1 的形式返回链接(例如这篇文章),它需要有人添加一个答案(在底部带有0票)最新的正确答案。

    ::https://github.com/dotnet/efcore/issues/8488 >

    它现在已添加到 EF.Functions 中,因此您可以简单地执行以下操作:

    Where(x=>  EF.Functions.IsDate(x.somefield))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-02
      • 2011-01-20
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      相关资源
      最近更新 更多