2

LINQ クエリで 1 つのテーブルに対して複数のカウントを行うのに問題があります。私はNHibernate、LINQ to NHibernate、およびC#を使用しています。

query はデータが入力されたリストです。FullRef というブール値を持つテーブルがあります。LINQ クエリを実行して、各 TrackId で FullRef = false および FullRef = true の発生回数を取得したいと考えています。TrackId は、track.Source == "UserRef" を取得するたびに新しい行を取得します。

次のクエリでは、FullRef = true の正しい数カウント (FullRefTrueCount から) を取得しますが、FullRefFalseCount で未知の間違った数を返します。

var query2 = from track in query
    where track.Source == "UserRef"
    group track by new { TrackId = track.TrackId, FullRef = track.FullRef } into d

    select new FullReferrer
    {
        Customer = d.Key.TrackId,
        FullRefFalseCount = d.Where(x => x.FullRef == false).Count(),
        FullRefTrueCount = d.Where(x => x.FullRef == true).Count()
    };

また、グループに FullRef が含まれないように変更しようとしました。これは、このように by の FullRef = track.FullRef を削除することによって行われました。

var query2 = from track in query
    where track.Source == "UserRef"
    group track by new { TrackId = track.TrackId } into d

    select new FullReferrer
    {
        Customer = d.Key.TrackId,
        FullRefFalseCount = d.Where(x => x.FullRef == false).Count(),
        FullRefTrueCount = d.Where(x => x.FullRef == true).Count()
    };

これで、.Where(x => x.FullRef == true/false) ステートメントを無視して、TrackId の合計数が得られます。

誰でもそれを修正する方法について何か考えがありますか? 問題は「グループ化」だと思います。どうにかしてグループ化を避けることはできますか? 参加する必要がありますか?

4

5 に答える 5

3

NHibernateの場合はわかりませんが、Linq With Entity Frameworkを使用すると、必要なものが得られるはずです:

var query2 = (
    from track in someDbSet
    select new FullReferrer
    {
          Customer = track.trackId
        , FullRefFalseCount = (from fullRefFalse in someDbSet.tracks
                               where fullRefFalse.IsSale == false 
                               && fullRefFalse.trackId == track.trackId
                               select fullRefFalse).Count()
        , FullRefTrueCount = (from fullRefTrue in someDbSet.tracks
                              where fullRefTrue.IsSale == true
                              && fullRefTrue.trackId == track.trackId
                              select fullRefTrue).Count()
    }
).Distinct();
于 2013-06-07T12:10:45.333 に答える
0

Count(条件)を試してみてください。

    FullRefFalseCount = d.Count(x => x.FullRef == false),
    FullRefTrueCount = d.Count(x => x.FullRef == true)
于 2013-06-07T11:25:42.190 に答える
0

これを試して。これにより、データ テーブルから期待されるデータが取得されます。

string source = "UserRef";
var result = from row in dt.AsEnumerable()
             where row["source"].Equals(source)
             group row by row["TrackId"]
             into g
             select new
                {
                   TrackId = g.Key,
                   FullRefTrueCount = ((from track in g where track["FullRef"].Equals("true") select track).Count()),
                   FullRefFalseCount = ((from track in g where track["FullRef"].Equals("false") select track).Count())
                };
于 2013-06-07T11:44:16.867 に答える
0

同様の問題を抱えている他の人には、「.AsEnumerable()」にすることで解決しました

var query2 = from track in query.AsEnumerable() // <--- the solution
    where track.Source == "UserRef"
    group track by new { TrackId = track.TrackId } into d

    select new FullReferrer
    {
        Customer = d.Key.TrackId,
        FullRefFalseCount = d.Count(x => !x.FullRef),
        FullRefTrueCount = d.Count(x => !x.FullRef)
    };
于 2013-06-13T11:15:30.377 に答える