【问题标题】:LINQ to entities : cannot call a methodLINQ to entity:无法调用方法
【发布时间】:2015-02-26 08:03:16
【问题描述】:

我知道已经有很多关于这个问题的帖子,但我似乎无法找到解决方案。

这是我的 Ling to Entities 查询:

IEnumerable<Tblstamp> changes = (from c in userGSN.edb.Tblstamp
                                 where (c.Ts_Date >= userGSN.DateLastCheck && 
                                        TimeSpan.Parse(c.Ts_Time) >= userGSN.TimeLastCheck)
                                 orderby c.Ts_Id ascending
                                 select c);

我想将c.Ts_time 与userGSN.TimeLastCheck 进行比较,但为此我必须将c.Ts_Time 转换为时间跨度(它是一个字符串,来自我无法修改的数据库,尝试了所有方法)。我也无法在查询之前在其他变量中进行转换,因为我无法在查询之外访问它。

显然,尝试在查询中使用 TimeSpan.Parse 方法时出现错误,但我找不到任何解决方法。我曾尝试使用 LINQ to Object,但由于我真的不习惯它,所以无法进行与此处相同的查询。

我知道这个问题,我只是想找到一个解决方法,需要一些帮助!

编辑: 所以我按照建议尝试了DateDiff 函数:

IEnumerable<Tblstamp> changes = (from c in userGSN.edb.Tblstamp
                                             where (c.Ts_Date >= userGSN.DateLastCheck && SqlFunctions.DateDiff("second",userGSN.TimeLastCheck,c.Ts_Time).Value > 0 )
                                             orderby c.Ts_Id ascending
                                             select c
                                             );

但它给了我同样的错误:"LINQ to Entities does not recognize the method 'System.Nullable1[System.Int32] DateDiff(System.String, System.Nullable1[System.TimeSpan], System.String)' method, and this method cannot be translated into a store expression."

尽管它明确表示here“你不能直接调用这个函数。这个函数只能出现在 LINQ to Entities 查询中。”,这正是我正在做的?!

【问题讨论】:

  • 你得到什么错误?
  • 通常的“LINQ to Entities 无法识别方法 'System.TimeSpan Parse(System.String)' 方法,并且该方法无法翻译成存储表达式。”
  • 你可能会逃脱 SqlFunctions.DateDiff msdn.microsoft.com/en-us/library/dd466158%28v=vs.110%29.aspx
  • 也许EntityFunctions.DiffDays方法可以帮助你。

标签: c# linq entity-framework


【解决方案1】:

没有干净的方法可以做到这一点,因此您必须跳出框框思考。尝试使用SqlFunctions.DateDiff 执行检查。您需要根据自己的使用情况对其进行调整,但是:

SqlFunctions.DateDiff("second", c.Ts_Time, userGSN.TimeLastCheck.ToString()) > 0

如果DateDiff 不合适,您可以使用other methods。参见EntityFunctions。

根据您用于查询数据的内容,您可能需要System.Data.Entity.SqlServer.SqlFunctions。

【讨论】:

  • 非常感谢,我会尝试并发布结果
  • 不客气。尽管您最好将 string 更改为更合适的内容。
  • System.Data.Entity.SqlServer.SqlFunctions 在相同情况下也不起作用
【解决方案2】:

您在 LinQ 中编写的用于从数据库获取数据的每个代码都必须转换为具有有效语句的有效 T-SQL 查询。并非所有 C# 方法在 T-SQL 中都有对应关系,因此每当您在代码中使用它们时同时填充数据时都会出错。

您应该在 SQL 端进行修改,或者在从数据库中获取数据后使用 C# 特定函数,同时处理内存中的实体,或者使用符合 SQL 语句的函数。

【讨论】:

  • 这就是我的意思,我知道 SQL 不能识别这种方法,我正在寻找一种能做等效并被 SQL 识别的方法!
【解决方案3】:

如果您无法让 EF 将您的查询转换为 SQL,也许您可​​以自己完成?见Writing SQL queries for entities

【讨论】:

    【解决方案4】:

    Linq to Entities 不支持所有函数,因为查询必须转换为 SQL:

     from c in userGSN.edb.Tblstamp.AsEnumerable()  
     //now you are allready getting the data from the database
     //so be carefull with that because you will have bad performance
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      相关资源
      最近更新 更多