繁体   English   中英

具有不同名称的实体框架查询表

[英]Entity Framework query table with different name

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

例:

TableA (
    Value1 INT NULL,
    Value2 INT NULL
)

TableB (
    Value1 INT NULL,
    Value2 INT NULL
)

.... etc ....

我需要对所有表执行完全相同的复杂计算/操作(完全相同)。 我该如何使用EF?

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

注意:EF模型优先方法

提前致谢

这个问题可能是重复的问题。 这里是链接,

您可以使用上面的帖子获取所需的实体列表。

当您拥有所需的实体列表时,请尝试此查询

      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();
        }
  1. 同时继承类( EmployerCustomer从普通的父类) - Person
  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>();

创建一个通用实体

对于实体中的特定行

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

我认为原始查询是您的烦恼: 原始SQL

因此,您基本上可以:

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

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

注意:我还没有尝试过,并且确保表必须完全相同(甚至列顺序)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM