Несколько одинаковых предметов в списке - PullRequest
0 голосов
/ 12 марта 2019

Итак, я думаю, что у меня проблема с ограничениями или, по крайней мере, что-то не так. В основном у меня есть запрос, который я выполняю со следующим набором результатов: enter image description here

Как видите, есть 6 записей. Теперь внутри моего приложения оно вернет 6 записей, но несколько раз добавит ордер OR00221, что ожидается, но не ожидается, что он добавит только первую, с многократным грузом 6.

enter image description here

Как видите, он добавляет 3-ю запись из набора результатов для всех элементов с этим OrdNr OR00221.

Я считаю, что проблема где-то здесь:

restriction.Add(Restrictions.In(Projections.Property<ItemToPlan>(x => x.TrailerType), TrailerType));

Источник класса:

   public static IList<ItemToPlan> GetItems(string[] TrailerType, Dictionary<string, string> filter, string orderBy, bool ascending, Dictionary<string, bool> groupingColumns)
        {
            if (TrailerType == null || TrailerType.Length == 0)
            {
                return new List<ItemToPlan>();
            }
            using (ISession session = NHibernateHelper.OpenSession())
            {
                var query = session.QueryOver<ItemToPlan>();
                var restriction = Restrictions.Conjunction();
                restriction.Add(Restrictions.In(Projections.Property<ItemToPlan>(x => x.TrailerType), TrailerType));
                if (filter != null)
                {
                    Type type = typeof(ItemToPlan);
                    IClassMetadata meta = session.SessionFactory.GetClassMetadata(type);

                    foreach (var item in filter)
                    {
                        if (!string.IsNullOrWhiteSpace(item.Value))
                        {
                            IType propertyType = meta.GetPropertyType(item.Key);

                            if (propertyType == NHibernateUtil.String)
                            {
                                restriction.Add(Restrictions.InsensitiveLike(Projections.Property(item.Key), item.Value, MatchMode.Anywhere));
                            }
                            else
                            {
                                restriction.Add(Restrictions.InsensitiveLike(Projections.Cast(NHibernateUtil.String, Projections.Property(item.Key)), item.Value, MatchMode.Anywhere));
                            }
                        }
                    }
                }
                if (restriction.ToString() != "()")
                {
                    query.Where(restriction);
                }
                if (groupingColumns != null)
                {
                    foreach (var item in groupingColumns)
                    {
                        if (item.Value)
                        {
                            query = query.OrderBy(Projections.Property(item.Key)).Asc;
                        }
                        else
                        {
                            query = query.OrderBy(Projections.Property(item.Key)).Desc;
                        }
                    }
                }
                else
                {
                    groupingColumns = new Dictionary<string, bool>();
                }
                if (!string.IsNullOrWhiteSpace(orderBy) && !groupingColumns.ContainsKey(orderBy))
                {
                    if (ascending)
                    {
                        query = query.OrderBy(Projections.Property(orderBy)).Asc;
                    }
                    else
                    {
                        query = query.OrderBy(Projections.Property(orderBy)).Desc;
                    }

                }
                var result = query.List<ItemToPlan>();

                return result;
            }

Источник в виде пасты: https://pastebin.com/aiTTBKBQ

1 Ответ

1 голос
/ 13 марта 2019

Вы можете использовать GroupBy, чтобы избежать дублирования записей, если эта проблема действительно существует в запросе.Я полагаю, что в вашей модели есть свойство OrdNr.

Вот пример того, как это сделать.

result = result.GroupBy(e => e.OrdNr).Select(e => e.FirstOrDefault());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...