【问题标题】:Entity Framework query table with different name具有不同名称的实体框架查询表
【发布时间】:2019-08-22 04:51:27
【问题描述】:

我有几张完全相同的表(表名除外)。数据不同,并且由于某些特定原因,它们无法合并到一个表中

例子:

TableA (
    Value1 INT NULL,
    Value2 INT NULL
)

TableB (
    Value1 INT NULL,
    Value2 INT NULL
)

.... etc ....

我需要对所有表(完全相同)执行相同的复杂计算/操作。我怎样才能用 EF 做到这一点?

在传统的SQL查询中,我们可以通过改变FROM 表名>来构造查询字符串。但我不知道如何用 EF 做到这一点

注意:EF 模型优先方法

提前致谢

【问题讨论】:

  • 添加了答案

标签: entity-framework ef-model-first


【解决方案1】:

此问题可能重复 Here是链接,

您可以使用上面的帖子来获取您想要的实体列表。

当你有你想要的实体列表时尝试这个查询

      foreach (var table in entities)
        {
          var record =  (from x in table 
                where x.Value1 == 1
                select new CommonTableModel()
                {
                          Value1  = x.Value1 , 
                          Value2  = x.Value2 
                }).ToList();
        }

【讨论】:

    【解决方案2】:
    1. 从公共父类Person继承两个类(EmployerCustomer)。
    2. 所有常用方法都应该成为带有约束的泛型 - where T : Person,这样您就可以访问这些方法中两个类的所有属性。

    实施:

    public abstract class Person
    {
        public int Id {get;set;}
        public string Name {get;set;}
        public int Age {get;set;}
    }
    
    public class Employer : Person
    {}
    
    public class Customer : Person
    {}
    
    public List<T> GetPersonsOlderThan20Years<T>() where T : Person, new()
    {
        //any common logic
        return context.Set<T>().Where(x => x.Age > 20).ToList();
    }
    

    用法:

    var employers = GetPersonsOlderThan20Years<Employer>();
    var customers = GetPersonsOlderThan20Years<Customer>();
    

    【讨论】:

      【解决方案3】:

      创建一个通用实体

      实体中的特定行

      //int id or whatever your [key] attribute is
      public T GetSelected<T>(int id) where T : class
      {
          return _dbContext.Set<T>().FirstOrDefault(x => x.Id == id);
      }
      
      var selectedFromEntity1 = GetSelected<Entity1>(idOfEntity1);
      var selectedFromEntity2 = GetSelected<Entity2>(idOfEntity2);
      

      对于一个实体的所有行

      public List<T> GetAll<T>() where T : class
      {
          return _dbContext.Set<T>().ToList();
      }
      
      var dataFromEntity1 = GetAll<Entity1>();
      var dataFromEntity2 = GetAll<Entity2>();
      

      或者如果你想添加分页或条件

      public IQueryable<T> GetAll<T>()
      {
         return _dbContext.Set<T>().AsQueryable();
      }
      
      
      var dataFromEntity1 = GetAll<Entity1>();
      var resultFrom1 = dataFromEntity1
                           .Where(x => x.Property1 == "searchFilter") //user input searchFilter
                           .Skip(pageSize* pageNumber) //user input page size and page number
                           .Take(pageSize) //user input page size
                       .ToList();
      
      var dataFromEntity2 = GetAll<Entity2>();
      var resultFrom2 = dataFromEntity2
                           .Where(x => x.Property1 == "searchFilter") //user input searchFilter
                           .Skip((pageSize * pageNumber)-pageSize) //user input page size and page number
                           .Take(pageSize) //user input page size
                       .ToList();
      

      【讨论】:

        【解决方案4】:

        我认为原始查询是您的答案:Raw SQL

        所以你基本上可以:

           using (var context = new BloggingContext()) 
           {
              var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList(); 
           }
        

        并按照您的建议交换表的名称。

        注意:我没有尝试过,并且可以肯定表必须完全相同(甚至列顺序)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-31
          • 1970-01-01
          • 2011-07-13
          • 1970-01-01
          • 2012-02-14
          • 2014-01-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多