Вот упрощенный 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)
);
Теперь у меня есть такие классы ( они находятся в другом пространстве имен, а не в классах сущностей из datamodel ).
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, поэтому нет необходимости отслеживать исходные сущности БД.
Как видите, есть две цели. Иметь контроль над тем, какие данные берутся из базы данных, и повторно использовать эти структуры в других местах. Однако такой подход является огромной ошибкой, поскольку классы возвращают объект и используют его в дереве выражений.
Теперь я понимаю, что это не может волшебным образом создать выражение, чтобы создать целое с помощью одного запроса. Вместо этого он учитывается для каждой кампании отдельно. В довольно сложных сценариях это ужасное замедление.
Есть ли какой-нибудь простой способ, как этого добиться? Я думаю, эти классы должны возвращать некоторые выражения, но я совершенно новичок в этой области, и я не уверен, что делать.