Как заполнить свойства объектов с помощью LINQ и вернуть коллекцию - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть файл с такими строками: 05122018; фамилия1; ItemName1; Цена1

И OrderModel

public class OrderModel
    {
        public string ManagerSurname { get; set; }
        public DateTime Date { get; set; }
        public string CustomerSurname { get; set; }
        public string ItemName { get; set; }
        public double Price { get; set; }

    }

Как сделать запрос LINQ для возврата коллекцииOrderModels?

public IEnumerable<OrderModel> Parse(string[] input)
        {
            return
                (input ?? throw new ArgumentNullException(nameof(input)))
                .Select(orderModel => new OrderModel()
                {
                   //filling objects
                }).Where(orderModel => //Any);

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Учитывая, что массив input[] состоит из одной строки

05122018; фамилия1; ItemName1; Цена1

для каждой записи, и каждая строка имеет одинаковый порядок элементов,Вы можете сделать разбиение в select, чтобы получить соответствующие значения:

public IEnumerable<OrderModel> Parse(string[] input)
{
    return
        (input ?? throw new ArgumentNullException(nameof(input)))
        .Select(orderModel =>
        {
            var items = orderModel.Split(";");
            if (items.Length != 4)
            {
                throw new ArgumentException();
            }

            return new OrderModel()
            {
                //filling objects
                ManagerSurname = items[1],
                ItemName = items[2],
                ...
            };
        }).Where(orderModel =>  //Any);
}
0 голосов
/ 19 декабря 2018

По сути, вы выглядите так, как будто хотите deserialize строку, которая поступает из точки с запятой, разделенной на объект.Это довольно уродливый и потенциально хрупкий способ serialize / deserialize ваших данных, и если вы можете изменить его (на JSON, или XML или что-то еще), это может быть хорошей идеей.

Но вы можете создать конструктор для вашего OrderModel класса, который будет принимать сериализованную строку в качестве параметра и десериализовать ее там:

public OrderModel(string inOrderModel){
    var splitString = inOrderModel.Split(';');
    ManagerSurname = splitString[1];
    // etc
}

А затем вы можете использовать LINQ для создания списка извходящий массив:

return input.Select(i => new OrderModel(i));
0 голосов
/ 19 декабря 2018

возвращая просто return _context.OrderModel, вы вернете всю свою OrderModel из контекста:

public IEnumerable<OrderModel> Parse(string[] input)
{

(input ?? throw new ArgumentNullException(nameof(input)))

            return _context.OrderModel;
}

или, если вы хотите отфильтровать ваш набор данных по данным во входном массиве строк, вы можете отфильтровать с помощью input.contains(model.field),Примеры фильтров Имя элемента на основе массива входной строки:

public IEnumerable<OrderModel> Parse(string[] input)
    {

    (input ?? throw new ArgumentNullException(nameof(input)))

                return _context.OrderModel.Where(m => input.contains(m.ItemName));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...