相关疑难解决方法(0)

实体框架+ DayOfWeek

使用System.Linq.Dynamic(在这里管理https://github.com/kahanu/System.Linq.Dynamic),我试图使用Entity Framework 6(或更高版本)捕获在聚合目的DayOfWeek上找到的字段DateTime.

以前要求类似的东西,这有很大帮助,动态Linq +实体框架:动态选择的日期时间修改

实体框架支持DayOfWeek使用

SqlFunctions.DatePart("dw", datetime?)
Run Code Online (Sandbox Code Playgroud)

或者我们可以用类似的东西做一些更需要的东西

DbFunctions.DiffDays(date?, date?).  
Run Code Online (Sandbox Code Playgroud)

理念:

让Linq的DayOfWeek成为实体

我发现这非常有趣,我喜欢它,因为它不使用SqlFunctions可能让我局限于SQL Server的东西.此外,开发人员可以控制一周的第一天,而无需查询SQL Server属性以查找其配置方式(第一天).

出于实验目的,我一直试图在VisitMember()覆盖中实现这一点:

protected override Expression VisitMember(MemberExpression node)
{
     if (node.Type == typeof(System.DayOfWeek))
     {
          var firstSunday = new DateTime(1753, 1, 7);

                var firstSundayExpression = Expression.Constant(firstSunday, typeof(DateTime?));
                var timeValue = node.Expression;
                if (timeValue.Type != typeof(DateTime?)) timeValue = Expression.Convert(timeValue, typeof(DateTime?));
                var methodCall = Expression.Call(
                              typeof(DbFunctions), "DiffDays", Type.EmptyTypes, firstSundayExpression, timeValue);
                return Expression.Convert(methodCall, typeof(int?));
      } …
Run Code Online (Sandbox Code Playgroud)

c# linq expression-trees dynamic-linq entity-framework-6

4
推荐指数
1
解决办法
1820
查看次数

动态 LINQ OrderBy 日期仅在 DateTime 对象实体框架上

我目前正在使用动态 LINQ原始 codeplex 链接)库来实现动态搜索功能。我有一个要求,我需要OrderBy一个DateTime?只考虑日期而不是时间的字段。我正在使用EntityFramework.

这是示例实体。

public class SampleEntity
{
    public DateTime? DateCreated { get; set; }
    public bool Flag { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是查询数据库的代码。

var orderByString = "DateCreated.Value.Date asc, Flag"; //This is a dynamic string
var query = _context.Set<SampleEntity>().OrderBy(orderByString);
Run Code Online (Sandbox Code Playgroud)

这个表达式 ("DateCreated.Value.Date") 被解析没有问题,System.Linq.Dynamic但它抛出以下错误(这是可以理解的),因为它不受 LINQ to Entities 支持。请记住,这必须在 IQueryable 上工作(我不能使用这篇文章中的答案),因为我需要在服务器端进行排序。

LINQ to Entities 不支持指定的类型成员“日期”。仅支持初始值设定项、实体成员和实体导航属性。

解决的办法是使用DbFunctions.TruncateTime()如表示在这个答案等。但是,这不会与System.Linq.Dynamic

关于如何解决这个问题的任何想法。可能的解决方案是将另一列添加到只有日期部分的数据库DateCreated并查询该列。但是,我宁愿不这样做,而是在寻找解决此问题的其他方法。另一种方法是动态生成 lambda 表达式并返回 DbFunctions.TruncateTime,然后对 DB …

c# linq linq-to-entities entity-framework entity-framework-6

1
推荐指数
1
解决办法
1377
查看次数