2016-02-10 5 views
0

У меня есть метод, который возвращает объект типа CarsCache. Я хочу установить некоторые свойства в моем объекте Vehicle, у которого есть объект Car от CarChache объект. Я могу сделать это легко, как показано ниже:Как выбрать конкретные свойства через LINQ?

var carCahe = getByCarId(1); 

Vehicle v = new Vehicle(); 
v.Car.value1 = carCahe.value1; 

Но я хочу сделать это через LINQ. Я сделал что-то подобное с помощью LINQ, но этот метод возвращает коллекцию, а затем я использую где и выбираю. У меня есть объект Vehicle, и в автомобиле есть объект Car. Я делаю это вот так:

entity = new Vehicle 
{ 

    IsActive = true, 
    Car = DataCache.GetInstance() 
      .GetAllCars() 
      .ToList() 
      .Where(o => o.carId== carId) 
      .Select(o => new Car{Value1= o.value1, value2= o.value2}) 
      .Single() 
    }; 

Это также работает сейчас. Я хочу сделать это с помощью метода, который возвращает только один объект. Не сбор, но я не могу этого сделать. Я делаю это:

entity =new Vehicle 
{ 

    IsActive = true, 
    Car= DataCache.GetInstance() // it retruns carCahe object. 
     .GeTCarById(1) 
     //Here i want to set value1 property and value2 property 
}; 

Как это сделать?

+0

IMO, когда возвращаемое значение «GeTCarById» - это автомобиль с новыми значениями, ваш подход правильный;). –

+0

Если честно: если ваш первый подход работает, почему вы хотите сделать его более сложным и менее читаемым? Первый подход ясен, просто увидев его один раз для меня. Подход LINQ гораздо более подвержен ошибкам, менее отладочный, менее читабельный и фактически не нужен, если другой работает. – ckruczek

+0

@ckruczek согласился. LINQ медленный, но я просто хочу сделать это для своих знаний. – Umer

ответ

3

Я не думаю, что есть хороший способ реализовать второй подход, используя LINQ, поскольку возвращает только один элемент, а не список. Методы LINQ часто работают с перечислениями, поэтому вы не можете использовать такие методы, как Select в вашем случае.

Почему бы вам не получить данные из кэша первого оператора и назначить его, чтобы использовать его для создания Vehicle в другом заявлении:

var carCache = DataCache.GetInstance().GeTCarById(1); 
var entity = new Vehicle 
{ 
    IsActive = true, 
    Car = new Car { Value1 = carCache.value1, value2 = carCache.value2 } 
}; 
+0

Спасибо за ответ. Я сделал это. Можем ли мы сделать это в инициализаторе объекта? – Umer

+1

И «Vehicle» и «Car» уже используют инициализаторы объектов. Однако вы можете упростить инициализацию свойства 'Car', как описано в http://stackoverflow.com/questions/16794925/nested-object-initializer-syntax – dotnetom

2

Пожалуйста, попробуйте так:

var carCache = DataCache.GetInstance().GeTCarById(1); 
entity =new Vehicle 
{ 
    IsActive = true, 
    Car.value1 = carCache.value1, 
    Car.value2 = carCache.value2 
}; 

I предположим Car недвижимость в классе Vehicle уже заполнено Car объект как-то - не менее new instance.

+0

Спасибо за ответ – Umer

Смежные вопросы