這是我的表的簡化SQL,它被轉換爲LINQ to SQL模型。LINQ to SQL分離和數據結構的可重用性
CREATE TABLE Campaign (
Id int PRIMARY KEY,
Name varchar NOT NULL
);
CREATE TABLE Contract (
Id int PRIMARY KEY,
CampaignId int NULL REFERENCES Campaign(Id)
);
現在我有這樣的類(這些都是在不同的命名空間,從數據模型沒有實體類)。
public class CampaignInfo {
public static CampaignModel Get(DataModel.CampaignInfo campaign) {
return new CampaignInfo {
Id = campaign.Id,
Name = campaign.Name,
Status = CampaignStatus.Get(c)
};
}
public int Id {get; set;}
public int Name {get; set;}
public CampaignStatus { get; set;}
}
public class CampaignStatus {
public static CampaignStatus Get(DataModel.Campaign campaign) {
return new CampaignStatus {
Campaign = campaign.Id, // this is just for lookup on client side
ContractCount = campaign.Contracts.Count()
// There is much more fields concerning status of campaign
};
}
public int Campaign { get; set; }
public int ContractCount {get; set;}
}
而且比我跑的查詢:
dataContext.Campaigns.Select(c => CampaignInfo.Get(c));
其他代碼塊可以做這樣的事情:
dataContext.Campaigns.Where(c => c.Name == "DoIt").Select(c => CampaignInfo.Get(c));
或者我想狀態的列表活動:
dataContext.Campaigns.Select(c => CampaignStatus.Get(c));
注意:這些調用的結果將轉換爲JSON,因此不需要跟蹤原始數據庫實體。
正如你所看到的,有兩個目標。控制從數據庫中獲取數據並在其他地方重用這些結構。然而,這種方法是一個巨大的錯誤,因爲那些類返回對象並在表達式樹中使用它。
現在我明白了,它不能神奇地創建表達式來使整個事情與一個查詢。相反,它會分別計算每個廣告系列的數量。在相當複雜的情況下,這是醜陋的放緩。
是否有一些簡單的方法來實現這個目標?我想,這些類應該返回一些表達式,但我對這個領域完全陌生,我不知道該怎麼做。在查詢
using(var dataContext = new DataModel.ModelDataContext())
{
dataContext.Campaigns.Select(c => new {
Id = c.Id,
Name = c.Name,
Status = new CampaignStatus()
{
ContractCount = c.Contracts.Count()
}
})
}
:
我想,我已經想出了一部分。現在使用pastebin,所以在這裏不會太長。 http://pastebin.com/rttTgxyJ。而不是對象,我返回'Expression>'。但是我無法弄清楚如何用CampaignInfo打包CampaignStatus。 –
FredyC