2014-10-10 126 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