Как построить логическую комбинацию двух MethodCallExpressions - PullRequest
1 голос
/ 04 октября 2011

В примере используется база данных Northwind. База данных имеет таблицу «Заказы», ​​которая имеет «ShipName» и столбцы "ShipAddress". Каркасная модель сущности в программе на c # имеет Тип "Order", который имеет свойства "ShipName" и "ShipAddress".

Я хочу найти заказы с Order.ShipName, содержащим "некоторый шаблон" и Order.ShipAddress, содержащий «другой шаблон». Потому что ShipName и ShipAddress должен соответствовать некоторому шаблону (может содержать дикий символ * и?), Я должны использовать хранимую процедуру "sp_FindStringPattern", чтобы сделать строку поиск по шаблону. Хранимая процедура возвращает целочисленное значение, которое отображается в System.Boolean после сопоставления хранимой процедуры с функцией c #.

Следующий код компилируется и может работать. Но я не знаю, как объединить два MethodCallExpression с использованием PredicateBuilder.

    using(NorthwndEntities dataEntities = new NorthwndEntities())
    {
    // build a MethodCallExpression for Order.ShipName searching in database 
    ConstantExpression expEntity = Expression.Constant(dataEntities,typeof(NorthwndEntities));
    ParameterExpression pe = Expression.Parameter(typeof(Order), "o");
    MethodInfo minfo = dataEntities.GetType().GetMethod("sp_FindStringPattern");
    MemberExpression me1 = Expression.PropertyOrField(pe, "ShipName");
    string strName = "A*Corp";  // "*" is wild chars
    ConstantExpression ce1 = Expression.Constant(strName, typeof(string));
    MethodCallExpression meth1 = Expression.Call(expEntity, minfo, new Expression[] { me1, ce1});
    // build a methodCallExpression for Order.ShipAddress searching in database

    MemberExpression me2 = Expression.PropertyOrField(pe, "ShipAddress");
    string strAddr = "Huntington";
    ConstantExpression ce2 = Expression.Constant(strAddr, typeof(string));
    MethodCallExpression meth2 = Expression.Call(expEntity, minfo, new Expression[] { me2, ce2});
    }

Вопрос: Как с помощью построителя предикатов объединить выражение вызова двух методов «И»? Я пробовал много способов, но все не удалось (скомпилировать и запустить, пока не будет построен предикат "И"). Я ценю вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...