c# - Linq to sql 选择一个新类

标签 c# entity-framework c#-4.0 linq-to-sql

我的问题是,当我有以下 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/

相关文章:

c# - 我怎样才能写一个重置函数

c# - 是否有使用 basicHttpBinding 扩展 WCF 服务以允许 REST 服务与 JSON 通信的好方法?

c# - 如何使用 Newtonsoft.Json 序列化 "Really"循环引用对象?

c# - 在c#中动态创建Json

c# - 如何将任务的已取消状态传播到延续任务

c# - 窗体 View 被清除

c# - 支持 .NET 4.0 中的进度报告和增量结果 "Task Parallel Library"

entity-framework - 类型 'System.Data.Spatial.DbGeography' 必须是不可为 null 的值类型才能将其用作参数 'T'

c# - 将多个类映射到单个实体

c#-4.0 - 如何使用 C# 以编程方式将所有单元格的 Excel 边框设置为外部