EF Core 臨時表操作


網上找了兩個, 一個內存表, 一個臨時表.

1 安裝包: EntityFrameworkCore.MemoryJoin  //內存表 直接用select union拼接查詢  http://tsherlock.tech/2018/03/20/joining-in-memory-list-to-entity-framework-query/
DbContext類中加入:  protected DbSet<QueryModelClass> QueryData { get; set; } // 注意升遷代碼中 刪除此表的升遷代碼

2 引用:  https://dev.azure.com/pawelgerr/_git/Thinktecture.EntityFrameworkCore ; 或者:  https://github.com/yangzhinong/Thinktecture.EntityFrameworkCore 編譯后的dll
ConfigureServices方法中加入: 
          services.AddDbContext<SalesDbContext>(options => {
                options.UseSqlServer(_appConfiguration.GetConnectionString("Default"), opts => {
                    opts.AddTempTableSupport();
                });
            });
3. 定義通用的Repository的接口和實現
3.1 public interface ITempTableRepository {
        IQueryable<T> FromLocalList<T>(IList<T> data) where T : class;
        Task<IQueryable<T>> BulkInsertIntoTempTableAsync<T>(IEnumerable<T> entities) where T : class;
 }
3.2 public class TempTableRepository : SalesRepositoryBase<CodeTemplate<Guid>, Guid>, ITempTableRepository {
        public TempTableRepository(IDbContextProvider<SalesDbContext> dbContextProvider) : base(dbContextProvider) {
        }
        public async Task<IQueryable<T>> BulkInsertIntoTempTableAsync<T>(IEnumerable<T> entities) where T : class {
            var query = await Context.BulkInsertIntoTempTableAsync(entities, new SqlTempTableBulkInsertOptions() {
                PrimaryKeyCreation = PrimaryKeyCreation.None,
            });
            return query;
        }
        public IQueryable<T> FromLocalList<T>(IList<T> data) where T : class {
            return Context.FromLocalList(data);
        }
    }
3.3 DbContext中定義
     public  DbQuery<ImpTestTemp> ImpTestTemps { get; set; } 
==========================
4使用類中  注入ITempTableRepository即可
        private readonly IObjectMapper _objectMapper;
        private readonly IRepository<Area, Guid> _area;
         private readonly ITempTableRepository _tempTableRepository;
        public AreaService(IRepository<Area, Guid> area, IObjectMapper objectMapper,
            ITempTableRepository tempTableRepository) {
            _area = area;
            _objectMapper = objectMapper;
             _tempTableRepository = tempTableRepository;
        }
 
        public async Task<IEnumerable<GetAreaByParentIdOutput>> GetAreaByParentIdAsync(Guid? parentId) {
            var lst = new List<ImpTestTemp> {
                new ImpTestTemp { Id = 1, AreaId=new Guid("179A9943-EC6C-4923-8B75-00818198008E") ,Code = "123", Name = "yzn", Sorce=98.5m },
                new ImpTestTemp { Id = 2, AreaId= new Guid("48E8124C-789B-4158-BE9C-00507403DF7E"), Code = "456", Name = "seq" , Sorce=99.4m}
            };
             var queryList = await _tempTableRepository.BulkInsertIntoTempTableAsync(lst); //數據多可以用此方法
            var queryList2 =  _tempTableRepository.FromLocalList(lst); // 數據少可用此方法 
            var efQuery = (from t in queryList
                           join a in _area.GetAll()
                           on t.AreaId equals a.Id
                           select new {
                               t.Code,
                               AreaCode = a.Code,
                               a.Name
                           }).ToList();
         retun null;          
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM