我有一个三层ASP.Net Web应用程序。数据层引用了EF,它也包含所有存储库。所以我在那里安装了EF nuget。
然后我有一个服务层,用于在数据层与视图之间来回传输数据。问题是,最近我遇到了一个需要使用DbFunctions.AddDays
的需求,但是我不想为单个查询在服务层中安装完整的EF。有什么方法可以在不安装EF的情况下实现相同功能,即是否可以在不使用DbFunctions
的情况下实现相同功能?查询是:
Context.Article.Where(p => EntityFunctions.AddDays(p.StartDate, p.Period) > DateTime.Now);
答案 0 :(得分:1)
我们有一个比较日期的特殊方法,该特殊方法驻留在EF dll中。不知道为什么Date.AddDays()不起作用
没有充分的理由。已在EF Core和.NET Framework上运行的.NET Core中启用了此功能。 EG:
using Microsoft.EntityFrameworkCore;
using System;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Linq;
namespace EfCoreTest
{
public class Article
{
[Key]
public int ArticleId { get; set; }
public string ArticleTitle { get; set; }
public DateTime StartDate { get; set; }
public int Period { get; set; }
}
public class Db : DbContext
{
readonly string connectionString;
public Db(): this("server=.;database=EfCoreTest;Integrated Security=true")
{
}
public Db(string connectionString)
{
this.connectionString = connectionString;
}
public DbSet<Article> Articles { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(connectionString);
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
class Program
{
static void Main(string[] args)
{
using (var db = new Db())
{
db.Database.EnsureDeleted();
db.Database.EnsureCreated();
var r = db.Articles.Where(p => p.StartDate.AddDays(p.Period) < DateTime.Now).ToList();
}
Console.ReadKey();
}
}
}
翻译为
SELECT [p].[ArticleId], [p].[ArticleTitle], [p].[Period], [p].[StartDate]
FROM [Articles] AS [p]
WHERE DATEADD(day, [p].[Period], [p].[StartDate]) < GETDATE()