如果所有的表都有相同的列,那麼我會從這些表中提取一個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);
}
在數據庫存在包含兩個表只是Id
和Name
列
在開始使用X和Y之前,我相信在創建四個獨立的LINQ查詢時,未來的可讀性/可維護性有很多優點。通過創建一個通用函數,在四種方法中可能比通過節省代碼重複更多的優點。 – 2014-10-10 15:01:15
查看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
也許你可以這樣做他們建議這裏http://stackoverflow.com/questions/12455389/entity-framework-get-entity-by-name – 2014-10-10 15:17:05