我的问题是,当我有以下 2 个查询时,第一个没有填充 CampaignID 属性,但第二个有。这是我的代码;
查询1;
var query = from c in _context.MCTargets
where c.TargetDateFrom==d1 && c.TargetDateTo<=d2
group c by c.MarketingCampaignID into g
select new MSReport{
CampaignID = g.Key, // CampaignID is not populated here.
StartDate = d1,
EndDate = d2
};
查询2;
var query2 = from c in _context.MCTargets
where c.TargetDateFrom == d1 && c.TargetDateTo <= d2
group c by c.MarketingCampaignID into g
select new
{
CampaignID = g.Key,
StartDate = d1,
EndDate = d2
};
MSReport.cs
public class MSReport
{
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public int CampaignID { get; set; }
public MSReport()
{
// CampaignID = 0 here
// doing something with CampaignID here like setting some calculated properties.
}
}
提前致谢,并对我的解释不当深表歉意。
最佳答案
当使用对象初始化器语法时,初始化器中指定的值是在对象的构造函数执行后设置的。如果您需要尝试填充的值对构造函数可用,则必须添加一种构造函数形式,它将值作为参数并自行填充字段或属性。
在你的类里面:
public MSReport(int campaignID, DateTime startDate, DateTime endDate)
{
CampaignID = campaignID;
StartDate = startDate;
EndDate = endDate;
// doing something with CampaignID here like setting some calculated properties.
}
在您的查询中:
new MSReport(g.Key, d1, d2)
这将适用于 Linq to SQL 和 Linq to Objects。对于 Linq to Entities,必须采用不同的方法。
您可以使用匿名对象执行查询,然后运行第二个查询以将其转换为您想要的对象:
var query = from c in _context.MCTargets
where c.TargetDateFrom==d1 && c.TargetDateTo<=d2
group c by c.MarketingCampaignID into g
select new {
CampaignID = g.Key,
StartDate = d1,
EndDate = d2
};
IEnumerable<MSReport> queryMSReports = from item in query.AsEnumerable()
select new MSReport(item.CampaignID, item.StartDate, item.EndDate);
这会断开对象从 Linq 到 Entities 的连接,并允许您使用具有参数的构造函数创建所需的对象。查看LINQ to Entites 'parameterless constructor' error MSDN 上的论坛帖子以获取更多信息。
您的另一个选择是使用您的 MSReport 类和对象初始值设定项语法进行查询,然后在您的类上有一个您稍后必须调用的计算方法。
关于c# - Linq to sql 选择一个新类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12568587/