8

私の問題は、次の 2 つのクエリがある場合、1 つ目は CampaignID プロパティを設定していませんが、2 つ目は設定していることです。これが私のコードです。

クエリ 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.    
    }  
 }

事前に感謝し、私の説明が不十分で申し訳ありません。

4

3 に答える 3

18

オブジェクト初期化子構文を使用する場合、初期化子で指定された値は、オブジェクトのコンストラクターが実行された後に設定されます。設定しようとしている値をコンストラクターで使用できるようにする必要がある場合は、値を引数として取り、フィールドまたはプロパティ自体に設定するコンストラクターの形式を追加する必要があります。

あなたのクラスで:

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 の場合、別のアプローチを取る必要があります。

匿名オブジェクトを使用してクエリを実行してから、2 番目のクエリを実行して目的のオブジェクトに変換できます。

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 からエンティティに切断され、パラメーターを持つコンストラクターを使用して目的のオブジェクトを作成できるようになります。詳細については、MSDN のLINQ to Entites 'parameterless constructor' エラーフォーラムの投稿を参照してください。

もう 1 つのオプションは、MSReport クラスとオブジェクト初期化子構文を使用してクエリを実行し、後で呼び出す必要があるクラスに Calculate メソッドを持たせることです。

于 2012-09-24T16:18:54.997 に答える
0

Maybe defalt constructor runs before initialization of params? Try to add constructor in MSReport with your params and debug.

    public class MSReport
    {
        public DateTime StartDate { get; set; }
        public DateTime EndDate { get; set; }
        public int CampaignID { get; set; }

        public MSReport(int campaginId, ....)
        {
// use and initialize camaginId here
        }  
     }

and do:

select new MSReport(g.Key) {
                               StartDate = d1,
                               EndDate = d2
                    }
于 2012-09-24T16:07:45.707 に答える