powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Деревья выражений - как их "приготовить", чтобы они были "съедобными"?
5 сообщений из 5, страница 1 из 1
Деревья выражений - как их "приготовить", чтобы они были "съедобными"?
    #39320463
Solomka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте,

помогите пожалуйста разобраться с деревьями выражений.

Хочу вызвать метод в который передаю List орагнизаций, и три лямбда выражения.

Код: c#
1.
PrintDifference(Companies, c1 => c1.CompanyID == 42, c2 => c2.CompanyID == 44, c=>c.FullName);



Это тело метода:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
private string PrintDifference<T, TExtraProp1, TExtraProp2, TExtraProp3, TT >(IEnumerable<T> sourceInstance, 
            Expression<Func<T, TExtraProp1>> excludeExpression1,
            Expression<Func<T, TExtraProp2>> excludeExpression2,
            Expression<Func<TT, TExtraProp3>> excludeExpression3)
{

//сначало пытаюсь достать одну организацию
var company1 = sourceInstance.First(excludeExpression1);
//затем пытаюсь достать другую организацию
var company2 = sourceInstance.First(excludeExpression2);

//потом пытаюсь достать значение свойства "FullName" одной организации
var compareValue1 = company1.Select(excludeExpression3);
//потом пытаюсь достать значение свойства "FullName" другой организации
var compareValue2 = company2.Select(excludeExpression3);

if (compareValue1 == compareValue2) return "yes";


return "";
}




В интернете пыталась найти примеры, чтобы найти то, чтобы работало так как я бы задумала, но все равно компилятор, как не компилировался, так и не компилируется...
...
Рейтинг: 0 / 0
Деревья выражений - как их "приготовить", чтобы они были "съедобными"?
    #39320534
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Solomka,
Вообще как то так. По крайней мере компилируется.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
     private string PrintDifference<T, TExtraProp3, TT>(IEnumerable<T> sourceInstance,
            Expression<Func<T, bool>> excludeExpression1,
            Expression<Func<T, bool>> excludeExpression2,
            Expression<Func<T, TExtraProp3>> excludeExpression3) where TExtraProp3:IComparable<TExtraProp3>
        {

            //сначало пытаюсь достать одну организацию
            var company1 = sourceInstance.AsQueryable().First(excludeExpression1);
            //затем пытаюсь достать другую организацию
            var company2 = sourceInstance.AsQueryable().First(excludeExpression2);

            //потом пытаюсь достать значение свойства "FullName" одной организации
            var compareValue1 = excludeExpression3.Compile()(company1);// company1.Select(excludeExpression3);
            //потом пытаюсь достать значение свойства "FullName" другой организации
            var compareValue2 = excludeExpression3.Compile()(company2);// company2.Select(excludeExpression3);

            if (compareValue1?.CompareTo(compareValue2)==0) return "yes";


            return "";
        }
...
Рейтинг: 0 / 0
Деревья выражений - как их "приготовить", чтобы они были "съедобными"?
    #39320650
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Solomka,

Параметр sourceInstance должен иметь тип IQueryable<T>. В противном случае это всё не имеет смысла.
...
Рейтинг: 0 / 0
Деревья выражений - как их "приготовить", чтобы они были "съедобными"?
    #39320758
Solomka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВSolomka,
Вообще как то так. По крайней мере компилируется.
Код: c#
1.
  ...



Спасибо, Ваш Вариант мне помог, но...
У меня остался ещё один маленький вопросик.
С простыми свойствами которые напрямую входят в сущность класса организации, нет проблем.
Но осталась проблема если мы пытаемся подгрузить свойства из подствойств которые являются коллекции.
Допустим у организации есть несоклько контактов, и мы ходим сравнить контакты с кодом 5.
И у одной организации может отсутствовать такой контакт, а у другой присутствовать.
И тогда в момент компиляции выражения по доставанию свойства из организации возникает исключение System.InvalidOperationExeption {"Последовательность не содержит соответствующий элемент"}.
Как можно обойти ситуацию с тем что последовательность может не содержать элементов?
Можно конечно понаставить блоки try-catch...
Но это как то совсем не очень красиво будет.
Какое тут можно условие добавить, чтобы можно было обходить ситуцию с отсутствием записи с запрашиваемым значенияем???


Код: c#
1.
2.
3.
var Companies = (берем из БД список организаций).All().Include(x=>x.Contacts).ToList();
PrintDifference(Companies, c1 => c1.CompanyID == 105, c2 => c2.CompanyID == 136, c => c.FullName);
PrintDifference(Companies, c1 => c1.CompanyID == 105, c2 => c2.CompanyID == 136, c => c.Contacts.First(x=>x.ContactTypeID==5).Value);




Сам метод:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
private string PrintDifference<T, TExtraProp3>(IEnumerable<T> sourceInstance,
   Expression<Func<T, bool>> excludeExpressionSelectEntityToChange,
   Expression<Func<T, bool>> excludeExpressionSelectChangeInfo,
   Expression<Func<T, TExtraProp3>> excludeExpressionSelectProperty)  
{

// 
var memberEntityToChange = sourceInstance.AsQueryable().First(excludeExpressionSelectEntityToChange);
// 
var memberChangeInfo = sourceInstance.AsQueryable().First(excludeExpressionSelectChangeInfo);

// вот на этой строчке возникает ошибка InvalidOperationExeption 
var compareValueEntityToChange = excludeExpressionSelectProperty.Compile()(memberEntityToChange); 
// 
var compareValueChangeInfo = excludeExpressionSelectProperty.Compile()(memberChangeInfo);


if (compareValueEntityToChange.ToString() == compareValueChangeInfo.ToString()) return "yes";

return "";
}
...
Рейтинг: 0 / 0
Деревья выражений - как их "приготовить", чтобы они были "съедобными"?
    #39321289
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Solomka,
Делай соответствующие проверки.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Деревья выражений - как их "приготовить", чтобы они были "съедобными"?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]