Использование методов DbFunctions без установки Entity Framework nuget - PullRequest
0 голосов
/ 11 октября 2018

У меня есть трехуровневое веб-приложение ASP.Net.Уровень данных имеет ссылку на EF и содержит также все репозитории.Так что я установил EF Nuget там.

Тогда у меня есть сервисный уровень для передачи данных из уровня данных в представления и обратно.Проблема в том, что недавно я столкнулся с требованием, где мне нужно использовать DbFunctions.AddDays, но я не хочу устанавливать полный EF на уровне обслуживания для одного запроса.Есть ли способ, которым я могу добиться того же самого без установки EF, т.е. любой другой способ достичь того же самого без использования DbFunctions.Запрос:

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

1 Ответ

0 голосов
/ 12 октября 2018

у нас есть специальный метод для сравнения дат, и этот специальный метод находится в 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()
...