SqlQuerry ToList()有效,但Linq(Iqueryable)无效

本文关键字:Linq Iqueryable 无效 有效 ToList SqlQuerry | 更新日期: 2023-09-27 18:01:30

我有一个问题,根本不明白。所以我有这个SqlQuerry

var blogs = context.Meal.SqlQuery("SELECT * FROM dbo.Meal WHERE PersonID=" + id.ToString() + "AND DATEDIFF(day,GETDATE(),Datetime) <= 7 ").ToList();

这非常有效,但我试图将该表达式转移到linq,但我无法使ToList((运行

var blogs1 = from c in context.Meal
            where c.PersonID.Equals(id)
            where (DateTime.Now.Date - c.Datetime).Days <= 7
            select c;
List<Meal> blogs = blogs1.ToList();

我得到这个错误:

类型为"System"的未处理异常。中出现ArgumentExceptionEntityFramework。SqlServer.dll

附加信息:DbComparisonExpression需要具有的参数类似类型。

我在谷歌上搜索了很多,首先尝试了var博客,然后尝试了ToList<Meal>DateTime.Now,但我从网上复制了表达式,然后因为延迟执行,我写了这个

var blogs = (from c in context.Meal
            where c.PersonID.Equals(id)
            where (DateTime.Now.Date - c.Datetime).Days <= 7
            select c).ToList();

但不,它不会起作用:/我正在使用系统。Linq,我在StackOverflow上读到Linq支持Iqueryable ToList。有没有可能是我的林克错了,看起来很简单,我是从网上得到的,所以这不应该是错的?

如果你需要更多的信息,请在评论中键入,我会添加它。谢谢!

第1版:已更改。到的总天数。正如@garethb所建议的天数,但错误仍然存在。第二版:正如Matias建议的那样,我已经尝试过了

var now = DateTime.Now.Date;
var blogs1 = from c in context.Meal
             where c.PersonID.Equals(id)
             where EntityFunctions.DiffDays(now, c.Datetime) <= 7
             select c;
List<Meal> blogs = blogs1.ToList();

得到这个错误:(与SqlFunctions相同(

An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll
Additional information: LINQ to Entities does not recognize the method 'System.Nullable`1[System.Int32] DiffDays(System.Nullable`1[System.DateTime], System.Nullable`1[System.DateTime])' method, and this method cannot be translated into a store expression.

最后,我不小心把这个问题标记为重复,但事实并非如此。我不知道问题出在哪里,但主要的问题是微软在EF 6.x中将DiffDays方法的名称空间从EntityFunctions更改为DbContext,这就是为什么我的Linq不能工作的原因。在这个例子中,它可能是日期的比较,但它的方式不同,所以它不是重复的。

SqlQuerry ToList()有效,但Linq(Iqueryable)无效

您最有可能使用EntityFramework 6+。这意味着您需要使用DbFunctions类。我想对EF主线进行一些检查以解决这个问题,但现在使用这段代码。

https://msdn.microsoft.com/en-us/library/system.data.entity.dbfunctions.diffdays(v=vs.113(.aspx

var today = DateTime.Now.Date;
var blogs1 = from c in context.Meal
             where c.PersonID.Equals(id)
             where DbFunctions.DiffDays(today, c.Datetime) <= 7
             select c;
List<Meal> blogs = blogs1.ToList();
// add to top of file
using System.Data.Entity;
// code
var today = DateTime.Now.Date;
var blogs1 = from c in context.Meal
            where c.PersonID == id
            && DbFunctions.DiffDays(today, c.Datetime) <= 7
            select c;
List<Meal> blogs = blogs1.ToList();

请参阅DbFunctions,这些是转换为sql server函数的c#表达式。