0

デスクトップとモバイルの両方の顧客を持つサイトを開発しています。分析のために、ユーザーがデスクトップまたはモバイルデバイスを介してサイトにアクセスしているかどうかを知りたいのですが、そのために、ユーザーのデバイスの詳細を格納するためのいくつかの列を持つデータベースに 1 つのテーブルがあります。IsMobile という列が 1 つあり、ユーザーのデバイスに基づいて true/false を格納しています。今、私はlinqクエリを使ってtrueとfalseの数を取得したい.

以下のコードを使用しています。

 public IList<IsMobile> IsMobile(DateTime fromDate, DateTime toDate)
    {
        var isMobile = (from d in _db.UserDeviceDetail
                        where ((d.CreatedOn.Month >= fromDate.Month && d.CreatedOn.Day >= fromDate.Day && d.CreatedOn.Year >= fromDate.Year) || (d.CreatedOn.Month <= toDate.Month && d.CreatedOn.Day <= toDate.Day && d.CreatedOn.Year <= toDate.Year))
                        group d by d.IsMobile into g 
                        select new IsMobile
                        {
                            Yes = g.Count(n => n.IsMobile == true),
                            No = g.Count(n => n.IsMobile == false)
                        }).ToList();

        return isMobile;
    }

私は適切なカウントの詳細を取得していますが、2 つのリスト項目で 1 つははいをカウントし、もう 1 つは No をカウントします。代わりに、一度に yes と no の両方をカウントして、単一のリスト項目を取得したい

そのまま: {はい 20; いいえ 0} {はい 0; いいえ10}

どのようにすべきか: {はい 20; いいえ10}

私はlinqクエリを初めて使用します。何が間違っているのか教えてください。

4

2 に答える 2

2

グループ化により、LINQ は 1 つではなく 2 つのアイテムを作成します。アイテムのセット全体を、それぞれが個別に処理される特定の数のサブセットに分割します。

グループ化のないクエリでうまくいくはずです。

UPD : 次のクエリは、1 つの IsMobile アイテムを含むリストを返す必要があります。リストの代わりにアイテムを 1 つだけ返すことができれば、単純化できます。

var isMobile = (from d in _db.UserDeviceDetail 
                        where ((d.CreatedOn.Month >= fromDate.Month && d.CreatedOn.Day >= fromDate.Day && d.CreatedOn.Year >= fromDate.Year) || (d.CreatedOn.Month <= toDate.Month && d.CreatedOn.Day <= toDate.Day && d.CreatedOn.Year <= toDate.Year)) 
                        select d).ToList(); 
return new List<IsMobile>(){
            new IsMobile{ 
                Yes = isMobile.Count(n => n.IsMobile == true), 
                No = isMobile.Count(n => n.IsMobile == false)}
            };
于 2012-10-22T08:37:57.540 に答える
1

アイテムの数とIList<IsMobile>の数を知りたいだけなのに、なぜ a を選択したいのですか?IsMobile == trueIsMobile == false

Tuple<int, int>代わりにa を返します。

public Tuple<int, int> mobileCounts(DateTime fromDate, DateTime toDate)
{
    var inTime = _db.UserDeviceDetail.Where(d=> (d.CreatedOn.Month >= fromDate.Month && d.CreatedOn.Day >= fromDate.Day && d.CreatedOn.Year >= fromDate.Year) || (d.CreatedOn.Month <= toDate.Month && d.CreatedOn.Day <= toDate.Day && d.CreatedOn.Year <= toDate.Year));
    int isMobileCount = inTime.Count(d => d.IsMobile);
    int isNotMobileCount = inTime.Count(d => !d.IsMobile);
    return Tuple.Create(isMobileCount,isNotMobileCount);
}

タプルのItem1とプロパティを介して両方の情報にアクセスできます。Item2

于 2012-10-22T08:00:11.657 に答える