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不能工作的原因。在这个例子中,它可能是日期的比较,但它的方式不同,所以它不是重复的。
您最有可能使用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#表达式。