2014-10-10 122 views
2

我正在研究數據倉庫應用程序,並且我們有4個表格,其中架構完全相同。這些表之間的區別只是表名。在LINQ查詢中動態設置表名稱

表範例:

  • ps_Contractor
  • ps_Employee
  • ps_Union
  • ps_NonUnion

架構

  • ID
  • 每小時
  • 利益

現在我需要基於這些表4份報告。我不想編寫4個單獨的LINQ查詢,而是希望編寫單個查詢,我可以動態地傳遞表名。

問題我如何在下面的LINQ查詢中動態地傳遞表名?

var data = (from q in _dbcontext.ps_Contractor 
join _l in _dbcontext.log on q.id equals l.tablelogid 
where q.hourly = 8 
select new{ 
hourly=q.hourly, 
benefit=q.benefit, 
total=q.total, 
log = l.message 
}.ToList(); 

我看過堆棧溢出提示的所有類似問題。我不想使用ExecuteStoreQuery。

我有什麼選擇?

+0

在開始使用X和Y之前,我相信在創建四個獨立的LINQ查詢時,未來的可讀性/可維護性有很多優點。通過創建一個通用函數,在四種方法中可能比通過節省代碼重複更多的優點。 – 2014-10-10 15:01:15

+0

查看http://stackoverflow.com/questions/3428069/how-to-map-an-entity-framework-model-to-a-table-name-dynamically我真的不會去這樣的程度只有4現在如果我們說的更像是說40重複,那麼我的觀點可能會改變。 – 2014-10-10 15:04:52

+0

也許你可以這樣做他們建議這裏http://stackoverflow.com/questions/12455389/entity-framework-get-entity-by-name – 2014-10-10 15:17:05

回答

3

如果所有的表都有相同的列,那麼我會從這些表中提取一個interface,並創建partial entity classes來實現該接口,最後使用該接口進行查詢。

例如:

//entities 
public partial class ps_Contractor: ICommonInterface{} 
public partial class Table2 : ICommonInterface{} 

在搜索方法我會通過IEnumerable<ICommonInterface>IQueryable<ICommonInterface>和應用上該查詢。您只需將不同的表格傳遞給該搜索方法即可。 或者你甚至可以有一種ICommonInterface類型的泛型類並使用它來執行查詢。

public void Example(IQueryable<ICommonInterface>dataSource) 
{ 
var data = (from q in dataSource 
join _l in _dbcontext.log on q.id equals l.tablelogid 
where q.hourly = 8 
select new{ 
hourly=q.hourly, 
benefit=q.benefit, 
total=q.total, 
log = l.message 
}.ToList(); 
} 

Example(_dbcontext.ps_Contractor.AsQueryable()) 

這僅僅是我現在待測樣品:

public class Repository 
{ 
    private List<string> GetData(IQueryable<IContractor> data) 
    { 
     return (from d in data select d.Name).ToList(); 
    } 

    public List<string> GetFullTime() 
    { 
     using (var context = new TestDbEntities()) 
     { 
      return GetData(context.FTContractors.AsQueryable()); 
     } 
    } 

    public List<string> GetPartTime() 
    { 
     using (var context = new TestDbEntities()) 
     { 
      return GetData(context.PTContractors.AsQueryable()); 
     } 
    } 
} 

實體:

public interface IContractor 
    { 
     int Id { get; set; } 
     string Name { get; set; } 
    } 

    public partial class FTContractor : IContractor 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
public partial class PTContractor : IContractor 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

測試:

[TestMethod] 
     public void Temp() 
     { 
      var tester = new Repository(); 

      var ft = tester.GetFullTime(); 
      var pt = tester.GetPartTime(); 

      Assert.AreEqual(3, ft.Count); 
      Assert.AreEqual(4, pt.Count); 
     } 

在數據庫存在包含兩個表只是IdName

+0

你應該嘗試在一個工​​作的例子中解決這個問題。我沒有看到你如何「使用該接口來查詢」。 EF不支持LINQ語句中的通用參數。 – 2014-10-10 17:24:53

+0

@GertArnold,我沒有真正使用接口進行查詢,而是使用它只是爲了能夠訪問屬性來編寫查詢。 – 2014-10-10 17:41:16