SqlQuerry ToList()有效,但Linq(Iqueryable)没有?

时间:2016-08-09 23:45:29

标签: c# linq

我遇到了问题,根本没有得到它。所以我有这个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();

我收到此错误:

  

未处理的类型&#39; System.ArgumentException&#39;发生在   EntityFramework.SqlServer.dll

     

其他信息:DbComparisonExpression需要参数   可比类型。

我搜索了很多内容,首先尝试使用var博客,然后尝试使用ToList<Meal>尝试DateTime.Now,但我复制了来自net的表达式,然后因为延迟执行我写了这个

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

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

如果您在评论中需要更多信息类型,我会添加它。谢谢!

EDIT1:将.TotalDays更改为.days为@garethb建议,但错误仍然存​​在。 编辑2:我已经尝试过,因为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.

为了完成,我不小心将此问题标记为重复,但它不是。我没有找到问题所在,但主要问题在于Microsoft将DiffDays方法的命名空间从EntityFunctions更改为EF 6.x中的DbContext,这就是我的Linq无法工作的原因。在这个例子中,它可能是日期的比较,但它是以不同的方式,所以它不重复。

2 个答案:

答案 0 :(得分:1)

// 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#表达式。

答案 1 :(得分:1)

您最有可能使用EntityFramework 6+。这意味着您需要使用DbFunctions类。我有一些我想要对EF主线做的签到来解决这个问题,但是现在使用这个代码。

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

{{1}}