Выберите все типы сотрудников, затем конкретного сотрудника

#c# #linq #polymorphism

#c# #linq #полиморфизм

Вопрос:

Это своего рода домашнее задание, поэтому кто-нибудь может подсказать мне (вместо ответа), как объединить эти два запроса LINQ. В этом вопрос

Обновите систему Payrolls с помощью LINQ, чтобы отобразить список в списке анонимных объектов, в котором каждый объект содержит имя сотрудника и заработок. При обнаружении BasePlusCommissionEmployee увеличьте базовую зарплату на 10% без изменения исходного объекта BasePlusCommissionEmployee. Отобразите имена и заработок.

пока у меня есть это

 var model1 = employees.OfType<BasePlusCommissionEmployee>().Select(x => new
    {
        x.FirstName,
        x.LastName,
        Increased_salary=x.BaseSalary*=1.10M
    });

var model = employees.Select(x => new
    {
        x.FirstName,
        x.LastName,
        earning = x.Earnings()
    });

foreach (var item in model)
    {
        Console.WriteLine(item);
    }
  

UML-диаграмма класса Диаграмма UML

Итак, запросы по отдельности работают нормально, но есть ли какой-нибудь способ сделать это одним запросом. Если потребуется какой-либо другой код, я его предоставлю.

Ответ №1:

Вы можете просто проверить, является ли сотрудник сотрудником base plus commission, используя троичный оператор внутри анонимного класса.

 employees.Select(x => new { 
    FirstName = x.FirstName,
    LastName = x.LastName,
    Salary = x is BasePlusCommissionEmployee ? (x as BasePlusCommissionEmployee).BaseSalary * 1.1M : x.Earnings()
}).ToList();
  

Комментарии:

1. Извините, но я забыл упомянуть, что Employee — это абстрактный класс, поэтому у Employee нет свойства BaseSalary, только у Basepluscommision есть свойство BaseSalary

2. Что ж, спасибо за ответ, это сработало, но я хотел бы, чтобы вы направляли меня вместо ответа (ну, без сожалений). но все равно спасибо