5

エンティティのコレクションの特定のプロパティの個別の値のリストを取得する必要があります。

したがって、テーブル A にフィールド x、y、z、1、2、3 があるとします。ここで、x は PK です (したがって、テーブルから外れます)。

y、z、1、2、または 3 のすべての一意の値を取得する必要がありますが、メソッドでどのフィールドを取得するかを必ずしも知る必要はありません。したがって、メソッドのパターンは次のようになります。

public List<ObjectName> GetUniqueFieldValues(string fieldname)

「ObjectName」オブジェクトは 2 つのプロパティを持つオブジェクトで、上記のメソッドは結果ごとに少なくとも 1 つのプロパティを埋めます。

別の質問の誰かが ParameterExpression および Expression クラスを使用して同様の回答をしましたが、特定のタスクに役立つ十分な情報を実際には提供しませんでした。

リフレクションも試しましたが、もちろん、Linq は Select 式内ではあまり好きではありません。

if を使用してそれを良いと呼びますが、実際のテーブル/オブジェクトには実際には大量のフィールド/プロパティがあるため、実用的ではありません。これにより、ベーステーブルが変更された場合でも、リファクタリングを少し節約できます。

私がやろうとしていることのSQLバージョン:

SELECT Distinct [usersuppliedfieldname] from TableName where [someotherconditionsexist]

私がすでに持っているものの疑似コード:

public List<ReturnObject> GetUniqueFieldValues(int FkId, ConditionObject searchmeta)
{
    using(DbEntities db = new DbEntities())
    {
        // just getting the basic set of results, notice this is "Select *"
        var results = from f in db.Table
                      where f.FkId == FkId && [some static conditions]
                      select f;

        // filtering the initial results by some criteria in the "searchmeta" object
        results = ApplyMoreConditions(results, searchmeta);

        //  GOAL - Select and return only distinct field(s) specified in searchmeta.FieldName)

    }
}
4

1 に答える 1

3

このようなことを試すことができます(重複として提案された投稿に似ています)

public static class DynamicQuerier
{
    private delegate IQueryable<TResult> QueryableMonad<TInput, TResult>(IQueryable<TInput> input, Expression<Func<TInput, TResult>> mapper);

    public static IQueryable<TResult> Select<TInput, TResult>(this IQueryable<TInput> input, string propertyName)
    {
        var property = typeof (TInput).GetProperty(propertyName);
        return CreateSelector<TInput, TResult>(input, property, Queryable.Select);
    }

    private static IQueryable<TResult> CreateSelector<TInput, TResult>(IQueryable<TInput> input, MemberInfo property, QueryableMonad<TInput, TResult> method)
    {
        var source = Expression.Parameter(typeof(TInput), "x");
        Expression propertyAccessor = Expression.MakeMemberAccess(source, property);
        var expression = Expression.Lambda<Func<TInput, TResult>>(propertyAccessor, source);
        return method(input, expression);
    }
}

私のテストでは、 と呼ばれるエンティティのダミー セットを作成しましたTests。以下は、Property2

var values = context.Tests.Select<Test, int>("Property2").Distinct();
于 2013-08-19T20:26:04.283 に答える