簡體   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