使用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)
理念:
我发现这非常有趣,我喜欢它,因为它不使用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) 我目前正在使用动态 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