1

.Select ステートメントを動的に追加したいのですが、コンパイラは現在のスコープ内でこれらのステートメントを構築することしか許可しません。解決策になる可能性のあるlinqkitを認識していますが、外部機能を追加したくありません。私が今持っているこのコードの重複を避けるにはどうすればよいですか:

 if (request.Equals("some text"))
        {
            var filter = commonFilter.GroupBy(x => new
                {
                    x.Timestamp.Year,
                    x.Timestamp.Month,
                })
                .Select(g => new
                {
                    Year = g.Key.Year,
                    Month = g.Key.Month,
                    TotErr = g.Count(),

                    column1 = g.Sum(o => o.Process.Contains("something") ? 1 : 0),
                    column2= g.Sum(o => o.Process.Contains(".something1") ? 1 : 0),
                    column3= g.Sum(o => o.Process.Contains(".something2") ? 1 : 0),
                    column4= g.Sum(o => o.Process.Contains("something3") ? 1 : 0),
                    column5= g.Sum(o => o.Process.Contains(".something4") ? 1 : 0),
                    column6 = g.Sum(o => o.Process.Contains(".something5") ? 1 : 0),
                    column7= g.Sum(o => o.Process.Contains(".something6") ? 1 : 0),
                    column8= g.Sum(o => o.Process.Contains(".something7") ? 1 : 0),
                    column9= g.Sum(o => o.Process.Contains(".something8") ? 1 : 0),

                    NumOrgs = g.Select(l => l.OrganizationId).Distinct().Count(),
                    NumUsers = g.Select(l => l.UserId).Distinct().Count(),

                });

            return filter.AsPa......;//not important right now
        }
        //Same thing again but slightly different
        else if (request.Equals("some other text"))
        {
            var filter = commonFilter.GroupBy(x => new
                {
                    x.Timestamp.Year,
                    x.Timestamp.Month,
                    x.Timestamp.Day
                })
                .Select(g => new
                {
                    Year = g.Key.Year,
                    Month = g.Key.Month,
                    Day= g.Key.Day,
                    TotErr = g.Count(),

                    column1 = g.Sum(o => o.Process.Contains("something") ? 1 : 0),
                    column2= g.Sum(o => o.Process.Contains(".something1") ? 1 : 0),
                    column3= g.Sum(o => o.Process.Contains(".something2") ? 1 : 0),
                    column4= g.Sum(o => o.Process.Contains("something3") ? 1 : 0),
                    column5= g.Sum(o => o.Process.Contains(".something4") ? 1 : 0),
                    column6 = g.Sum(o => o.Process.Contains(".something5") ? 1 : 0),
                    column7= g.Sum(o => o.Process.Contains(".something6") ? 1 : 0),
                    column8= g.Sum(o => o.Process.Contains(".something7") ? 1 : 0),
                    column9= g.Sum(o => o.Process.Contains(".something8") ? 1 : 0),

                    NumOrgs = g.Select(l => l.OrganizationId).Distinct().Count(),
                    NumUsers = g.Select(l => l.UserId).Distinct().Count(),

                });

            return filter.AsPa......;//not important right now
        }
4

2 に答える 2

1

匿名タイプを維持する場合は、InternalsVisibleToAttributeを使用して、別の共通ライブラリが匿名タイプで動作できるようにすることができます。

以前、EFデータソースを使用してデータグリッド用の汎用フィルタリングライブラリを作成するためにこれを行いましたが、ある程度のリフレクションと汎用System.Linq.Expressionコンポーネントからの式の構築が含まれるため、非常に多くの場合を除いて、これは価値がない可能性があります。これを実行したいインスタンス。

msdn情報を参照してください:

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.aspx

選択パターンがより予測可能である場合、式の部分は必要ないかもしれませんが、その場合、匿名クラスの代わりにパブリッククラスを使用する方が最終的には簡単かもしれません。

編集:「匿名をxに変換できません」タイプのエラーは、匿名を完全に/正しく削除していないことを意味します。

新しい{...whatever...}がある場所のそれぞれで、匿名タイプを作成しています。割り当てているものと一致する正しいプロパティを持つクラスごとにクラスを作成する場合は、次のように変更するだけです。

new {x=1,y=2}

読む

new somenewclass() {x=1,x=2}

他の場所で定義したと仮定します

public class somenewclass
{
    public int x {get;set;}
    public int y {get;set;}
}
于 2012-06-18T14:35:56.433 に答える
0

あなたはこのようにすることができます、

  var Query = commonFilter.Select(g => new
            {
                Year = g.Key.Year,
                Month = g.Key.Month,
                Day= g.Key.Day,
                TotErr = g.Count(),

                column1 = g.Sum(o => o.Process.Contains("something") ? 1 : 0),
                column2= g.Sum(o => o.Process.Contains(".something1") ? 1 : 0),
                column3= g.Sum(o => o.Process.Contains(".something2") ? 1 : 0),
                column4= g.Sum(o => o.Process.Contains("something3") ? 1 : 0),
                column5= g.Sum(o => o.Process.Contains(".something4") ? 1 : 0),
                column6 = g.Sum(o => o.Process.Contains(".something5") ? 1 : 0),
                column7= g.Sum(o => o.Process.Contains(".something6") ? 1 : 0),
                column8= g.Sum(o => o.Process.Contains(".something7") ? 1 : 0),
                column9= g.Sum(o => o.Process.Contains(".something8") ? 1 : 0),

                NumOrgs = g.Select(l => l.OrganizationId).Distinct().Count(),
                NumUsers = g.Select(l => l.UserId).Distinct().Count(),

            });
    if (request.Equals("some text"))
    {
        var filter = Query.GroupBy(x => new
            {
                x.Timestamp.Year,
                x.Timestamp.Month,
            }) ;
    }
    //Same thing again but slightly different
    else if (request.Equals("some other text"))
    {
        var filter = Query.GroupBy(x => new
            {
                x.Timestamp.Year,
                x.Timestamp.Month,
                x.Timestamp.Day
            });
    }
于 2012-06-18T14:19:56.583 に答える