Сценарий сводного типа с объектами на C#

Рассмотрим этот сценарий

У меня есть класс User, который содержит список типов автомобилей (например, Toyota, BMW).

Так что у пользователя может быть много автомобилей.

Допустим, у меня есть список типа User. В этом текущем формате я могу легко найти все автомобили, которыми владеет пользователь.

Чего я не могу легко сделать, так это найти всех пользователей, владеющих определенным типом автомобиля (например, всех пользователей, владеющих Toyota).

В классическом понимании базы данных я хочу иметь возможность поворачивать данные, но как добиться такой операции при работе с такими объектами в C#?

Спасибо, Томас.


person Prof    schedule 18.04.2013    source источник


Ответы (3)


У вас есть отношения «один ко многим», поэтому вы можете идти в обоих направлениях. Получите автомобили, у которых есть пользователи, и получите пользователей, у которых есть автомобили. См. следующий код C#:

class Users
{
    public string Name { get; set; }

    public List<Car> Cars { get; set; }
}

class Car
{
    public string Name { get; set; }
}

var users = new List<Users>
                    {
                        new Users
                            {
                                Name = "Bob",
                                Cars = new List<Car> { new Car { Name = "Toyota" } }
                            }
                    };

// Any Cars with Name "Toyota" in a User's list of cars.    
var usersWithCar = users.Where(user => user.Cars.Any(car => car.Name == "Toyota"));


string userName = usersWithCar.Single().Name; // Bob
person Sam Leach    schedule 18.04.2013

вы должны попробовать использовать Linq, сначала вам нужно добавить ссылку на System.Linq (если это еще не сделано)

Далее вы можете сделать что-то вроде этого:

List<User> Example = new List<User>();
var Users_Having_A_Renault_ZE = Example.Where(
Me => Me.MyCars.Any(
    Car => Car.MyName == "Renault ZE"))

Это означает «Принимает всех пользователей, у которых есть еще один автомобиль с именем Renault ZE» + предполагается, что MyCars — это список, массив или что-то в этом роде.

person Nyashes    schedule 18.04.2013

Вы можете использовать LINQ для достижения этой цели.

    class Car {}
    class Toyota : Car {}
    class BMW : Car {}

    class User
    {
        private readonly IList<Car> cars = new List<Car>();
        public IList<Car> Cars { get { return cars; } }
        public void AddCar(Car car)
        {
            Cars.Add(car);
        }
    }


    User user1 = new User();
    user1.AddCar(new BMW());
    user1.AddCar(new Toyota());

    User user2 = new User();
    user2.AddCar(new BMW());

    var users = new List<User>
                        {
                            user1,
                            user2
                        };
    IEnumberable<User> usersWithBMW = users.Where(u => u.Cars.Any(c => c is BMW));
person aquaraga    schedule 18.04.2013