【问题标题】:Using DbFunctions methods without installing Entity Framework nuget在不安装实体框架 nuget 的情况下使用 DbFunctions 方法
【发布时间】:2019-03-16 07:04:00
【问题描述】:

我有一个三层的 ASP.Net Web 应用程序。数据层引用了 EF,它也包含所有存储库。所以我在那里安装了EF nuget。

然后我有一个服务层来将数据传输到数据层和从数据层传输到视图。问题是,最近我遇到了一个要求,我需要使用 DbFunctions.AddDays 但我不想在服务层中为单个查询安装完整的 EF。有没有什么方法可以在不安装 EF 的情况下实现相同的效果,即任何其他方法可以在不使用DbFunctions 的情况下实现相同的效果。查询是:

Context.Article.Where(p => EntityFunctions.AddDays(p.StartDate, p.Period) > DateTime.Now);

【问题讨论】:

  • 实际上没有,我在服务层编写查询没有任何问题。我刚刚发现,出于某种奇怪的原因,我们有一种比较日期的特殊方法,并且该特殊方法位于 EF dll 中。不知道为什么 Date.AddDays() 不起作用

标签: asp.net-mvc entity-framework linq-to-entities dbfunctions


【解决方案1】:

我们有一个比较日期的特殊方法,该特殊方法位于 EF dll 中。不知道为什么 Date.AddDays() 不起作用

没有充分的理由。这是在EF Core 中启用的,它在.NET Framework.NET Core 上运行。例如:

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()

【讨论】:

  • 谢谢,其实我已经是一个项目的中途,无法切换到 EF Core,但我会牢记这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多