2

プロパティ名 (文字列) とフィルターを希望する値だけを持っている状況があります。true名前が繰り返された場合にリストをフィルタリングして返す必要があります。

フィルターはそれを自分で除外する必要があることに注意してください。次のような表現で:p => p.Id != currentId

コード

プロパティは文字列であるため、この問題を解決するために動的式を作成することにしました。

[TestMethod]
public void TestingExpression()
{
    // Arrange
    var fix = new Fixture();
    var list = fix.Build<User>()
                    .With(p => p.Name)
                    .OmitAutoProperties()
                    .CreateMany(20).AsQueryable(); // Create IQueryable<User> with 20 users

    // Act 
    var currentId = 2;
    var uniquePropName = "Name";
    var uniqueValue = "{NotFoundValue}";

    // Expression: p => p.Id != currentId
    ParameterExpression pId = Expression.Parameter(typeof(int), "Id");
    ConstantExpression cId = Expression.Constant(currentId, typeof(int));
    BinaryExpression notCurrent = Expression.NotEqual(pId, cId);
    Expression<Func<int, bool>> NotCurrentExpr =
        Expression.Lambda<Func<int, bool>>(
            notCurrent,
            new ParameterExpression[] { pId });

    // Expression: p.{uniquePropName} == {uniqueValue}
    ParameterExpression pUnique = Expression.Parameter(typeof(string), uniquePropName);
    ConstantExpression cUnique = Expression.Constant(uniqueValue, typeof(string));
    BinaryExpression checkUnique = Expression.Equal(pUnique, cUnique);
    Expression<Func<string, bool>> CheckUniqueExp =
        Expression.Lambda<Func<string, bool>>(
            checkUnique,
            new ParameterExpression[] { pUnique });


    var exp = Expression.And(NotCurrentExpr, CheckUniqueExp);

    // Asset
    list.Provider.CreateQuery<User>(exp).ToList()
            .Should().HaveCount(19);

}

質問

目標は、動的式を次のように作成することです。query.Any(p => p.Id != id && p.{Dynamic} == nome);

しかし、私は続ける方法がわからない..

ありがとう

4

1 に答える 1

1

素敵なチュートリアルがここにあります。

パラメータとプロパティを混同しているようです。次に例を示します。

//user => user.SomeProperty == someValue

//the parameter of the predicate, a User object in your case 
ParameterExpression parameter = Expression.Parameter(typeof(User), "user");

//the property of the user object to use in expression
Expression property = Expression.Property(parameter, myPropertyNameString);

//the value to compare to the user property
Expression val = Expression.Constant(myValueToCompare);

//the binary expression using the above expressions
BinaryExpression expEquals = Expression.Equal(property, val);

//create the Expression<Func<T, Boolean>>
var predicate = Expression.Lambda<Func<User, Boolean>>(expEquals, parameter);

さらに、コードで2つのラムダを作成しようとしますが、目的は生成することです

p => p.Id != id && p.{Dynamic} == nome

これは、2 つのバイナリ式と結果ANDを生成する条件演算子で構成される本体を持つ 1 つのパラメーターを受け取る単一のラムダです。Boolean代わりに を使用して演算子をバイナリ式Expression.AndAlso()に適用し、を使用して最終的なラムダ式を取得する必要があります。&&Expression.Lambda<Func<User, Boolean>>()

于 2013-05-27T02:33:29.790 に答える