0

データベースに文字列を保存しています:

"Users.ElementAt(1).LastName"

次に、次のようなオブジェクトがあります。

        MyClass myclass = new MyClass ()
        {
            Users = new List<User>()
            {
                new User()
                {
                    LastName = "LastName1"
                },
                new User()
                {
                    LastName = "LastName2"
                },
            }
        };  

指定された文字列をオブジェクトに対して解析/評価/実行して、各ユーザーの姓を取得する方法はありますか?

DynamicLinq ライブラリを使用していますが、ElementAt(1) で次のエラー メッセージの問題が発生しています。

「該当する集計メソッド 'ElementAt' が存在しません」

誰でもここでガイダンスを提供できますか? 独自のパーサーを作成してリフレクションを使用する必要がありますか?

4

3 に答える 3

0

DynamicLinq の式パーサーは、標準の LINQ 演算子メソッドのサブセットのみをサポートしているようです。

interface IEnumerableSignatures
{
    void Where(bool predicate);
    void Any();
    void Any(bool predicate);
    void All(bool predicate);
    void Count();
    void Count(bool predicate);
    void Min(object selector);
    void Max(object selector);
    void Sum(int selector);
    void Sum(int? selector);
    void Sum(long selector);
    void Sum(long? selector);
    void Sum(float selector);
    void Sum(float? selector);
    void Sum(double selector);
    void Sum(double? selector);
    void Sum(decimal selector);
    void Sum(decimal? selector);
    void Average(int selector);
    void Average(int? selector);
    void Average(long selector);
    void Average(long? selector);
    void Average(float selector);
    void Average(float? selector);
    void Average(double selector);
    void Average(double? selector);
    void Average(decimal selector);
    void Average(decimal? selector);
    void Take(int count);
    void Union(IQueryable right);
    void OrderBy(LambdaExpression exp);
    void OrderByDescending(LambdaExpression exp);
}

ご覧のとおり、ElementAtその中にはありません。良いニュースは、単に追加void ElementAt(int index);するIEnumerableSignaturesだけで問題なく動作するように見えることです。つまり、もちろん、使用している LINQ クエリ プロバイダーがElementAt演算子を処理すると仮定します。そうでない可能性は十分にあります。

しかし、DynamicLinq のソースを変更できない場合は、コアの .NET Framework または LINQ 内に、これらの種類の式を解析および評価する機能がありません。他にもオプションがあります (ScriptCS、Roslyn を参照) が、解決しようとしている実際の問題に対する「過剰な」解決策に向かっているのではないかと思います。

于 2013-10-10T16:34:40.417 に答える
0
var allLastNamesInList= Users.Select(x=> x.LastName).toList();

このステートメントはリストを反復処理し、すべての姓を取得します。order by を使用して姓を順番に取得することもできます。

これはあなたが探している要件ですか、それとも何か違うものですか?

于 2013-09-27T01:53:46.457 に答える