-1

私の問題は解決するのが難しいです。この問題はあなたの助けが必要です。コードファーストには多対多の関係があります。しかし、私はこれを解決することはできません。述語関数を使用したいと思います。でも解決できないの?「メソッド(述語関数)」の使い方

     public int Method<T>(Predicate<T> func)
    {


        var s1 = this.Uow.X.GetAll().Where(func)
                       .SelectMany(a => a.OrganizationalUnits.Where(q => Identity.Y.Contains(q.Z)))
                      .GroupBy(t => t, (k, g) => new
                      {
                          Tag = k,
                          Count = g.Count()
                      })
                      .OrderByDescending(g => g.Count);


        var s2 = this.Uow.X.GetAll().Where(func)
                        .SelectMany(a => a.Classes.Where(q => Identity.Y.Contains(q.K)))
                        .GroupBy(t => t, (k, g) => new
                        {
                            Tag = k,
                            Count = g.Count()
                        })
                        .OrderByDescending(g => g.Count);


        var s3 = this.Uow.X.GetAll().Where(func)
                        .SelectMany(a => a.Courses.Where(q => Identity.Y.Contains(q.L)))
                        .GroupBy(t => t, (k, g) => new
                        {
                            Tag = k,
                            Count = g.Count()
                        })
                        .OrderByDescending(g => g.Count);



        return s1.ToString().Count() + s2.ToString().Count() + s3.ToString().Count();
    }
4

1 に答える 1

1

これがその方法です。ToString()オブジェクトをカウントするために文字列にする必要がないため、最後の行の sも削除しました。

次のように呼び出します。 int result = Method<TypeGoesHere>(p => p == aValue);

 public int Method<T>(Expression<Func<T, Boolean>> Predicate)
{


    var s1 = this.Uow.X.GetAll().Where(Predicate)
                   .SelectMany(a => a.OrganizationalUnits.Where(q => Identity.Y.Contains(q.Z)))
                  .GroupBy(t => t, (k, g) => new
                  {
                      Tag = k,
                      Count = g.Count()
                  })
                  .OrderByDescending(g => g.Count);


    var s2 = this.Uow.X.GetAll().Where(Predicate)
                    .SelectMany(a => a.Classes.Where(q => Identity.Y.Contains(q.K)))
                    .GroupBy(t => t, (k, g) => new
                    {
                        Tag = k,
                        Count = g.Count()
                    })
                    .OrderByDescending(g => g.Count);


    var s3 = this.Uow.X.GetAll().Where(Predicate)
                    .SelectMany(a => a.Courses.Where(q => Identity.Y.Contains(q.L)))
                    .GroupBy(t => t, (k, g) => new
                    {
                        Tag = k,
                        Count = g.Count()
                    })
                    .OrderByDescending(g => g.Count);

    return s1.Count() + s2.Count() + s3.Count();
}

おそらく、どのタイプの拡張メソッドも必要になると思いますthis。次のようになります (thisTypeタイプが の場合this)。あなた (私ではない) は の型を知っているので、これはテンプレートである必要はありませんX.GetAll()<int>T int になるList を推測しています。また、コードをより簡潔に変更しましたが、機能は同じです。(元のコードが間違ったことを行っていた可能性がありますが、これは同じことを行います。)

次のように呼び出します。

thisType something = new something();
someType aValue = X; // don't know the type here.

// do stuff with something

int result = something.Method(p => p == aValue);

コード:

public static int Method(this thisType me, Expression<Func<someType, Boolean>> Predicate)
{
    var allOfEm = me.Uow.X.GetAll().Where(Predicate);

    var s1 = allOfEm
              .SelectMany(a => a.OrganizationalUnits.Where(q => Identity.Y.Contains(q.Z)))
              .Distinct();

    var s2 = allOfEm
              .SelectMany(a => a.Classes.Where(q => Identity.Y.Contains(q.K)))
              .Distinct();

    var s3 = allOfEm
              .SelectMany(a => a.Courses.Where(q => Identity.Y.Contains(q.L)))
              .Distinct();

    return s1.Count() + s2.Count() + s3.Count();
}
于 2013-07-26T09:39:58.470 に答える