我知道有很多关于这个问题的帖子,但我似乎无法为此找到解决方案。
这是我的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
转换为时间跨度(它是一个字符串,来自数据库,我可以&#39) ; t修改,尝试了一切)。我也无法在查询之前进行转换,因为我无法在查询之外访问它。
显然,我在查询中尝试使用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.Nullable
1 [System.Int32] DateDiff(System.String,System.Nullable 1[System.TimeSpan], System.String)' method, and this method cannot be translated into a store expression."
即使它清楚地说here&#34;你也不能直接调用这个函数。此函数只能出现在LINQ to Entities查询中。&#34;,这正是我正在做的事情?!
答案 0 :(得分:0)
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
答案 1 :(得分:0)
您在LinQ中编写的用于从数据库获取数据的每个代码都必须转换为具有有效语句的有效T-SQL查询。并非所有C#方法都在T-SQL中具有对应性,因此每当您在代码中使用它们时,您都会遇到错误。
您应该在SQL端进行修改,或者在使用数据库中的数据后使用C#spesific函数,同时使用内存中的实体,或使用符合SQL语句的文件。
答案 2 :(得分:0)
没有干净的方法可以做到这一点,所以你必须跳出框框思考。尝试使用SqlFunctions.DateDiff
执行检查。您需要根据自己的使用情况进行调整,但是:
SqlFunctions.DateDiff("second", c.Ts_Time, userGSN.TimeLastCheck.ToString()) > 0
如果DateDiff
不适合,您可以使用other methods。另见EntityFunctions
。
根据您用于查询数据的内容,您可能需要System.Data.Entity.SqlServer.SqlFunctions
代替。
答案 3 :(得分:0)
如果你不能让EF将你的查询翻译成SQL,也许你可以自己做?见Writing SQL queries for entities