这是我的表的简化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