powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Метод с параметром List<int> в теле запрос Linq с условием Where
6 сообщений из 6, страница 1 из 1
Метод с параметром List<int> в теле запрос Linq с условием Where
    #40007482
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте! Есть класс модели
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 public partial class ViewGoodsStocksMvc
    {
        public int GoodId { get; set; }
        public string Articul { get; set; }
        public string Widht { get; set; }
        public int Available { get; set; }
        public decimal CurrentPrice { get; set; }
        public string Type { get; set; }
        public string ManufName { get; set; }
        public string NomenclImagePath { get; set; }
        public int LenghtId { get; set; }
        public int TypeId { get; set; }// параметр фильтрации
      
    }


Есть объект
Код: c#
1.
IEnumerable<ViewGoodsStocksMvc>objGoods


Этот объект наполнен данными из данной модели .
Теперь нужно его отфильтровать. Критерием фильтра должен быть List<int>TypeIdList
Этот List содержит неизвестное количество значений TypeId

то есть допустим этот лист приходит в параметр метода, и должно быть
примерно так.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
void GetListGoods(List<int>TypeIdList)
{
obgGoods=obgGoods
.Where obgGoods.TypeId==1
.Where obgGoods.TypeId==333
.Where obgGoods.TypeId==44
.............................
.Where obgGoods.TypeId==n(последнее значение из листа)
}


Я это реализовал примерно так
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public IEnumerable<ViewGoodsStocksMvc> GoodList;
private void ShowSizes( List<int> TypeIdList)
    {
        GoodList = new List<ViewGoodsStocksMvc>();

        foreach (int typeId in TypeIdList)
        {
            IEnumerable<ViewGoodsStocksMvc> og =
         objGoods.Where(x => x.TypeId == typeId)
        
         .Select(x => x.First());
           GoodList = GoodList.Union(ws);

        };

    }


Существует ли лучший способ?
...
Рейтинг: 0 / 0
Метод с параметром List<int> в теле запрос Linq с условием Where
    #40007488
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
.Where(n => myList.Contains(n))
...
Рейтинг: 0 / 0
Метод с параметром List<int> в теле запрос Linq с условием Where
    #40007490
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если тут нет работы с IQueryable, то вместо List<int> используй HashSet<int>
...
Рейтинг: 0 / 0
Метод с параметром List<int> в теле запрос Linq с условием Where
    #40007570
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var foos = new[]
{
    new Foo { Str = "Str1", Value = 1},
    new Foo { Str = "Str2", Value = 2},
    new Foo { Str = "Str3", Value = 3},
    new Foo { Str = "Str4", Value = 4},
    new Foo { Str = "Str5", Value = 5},
    new Foo { Str = "Str6", Value = 6},
    new Foo { Str = "Str7", Value = 7},
};
var hashSet = new HashSet<int> { 1, 3, 5, 7, 8 };
var result = foos.Join(hashSet, p => p.Value, z => z, (p, z) => p);
...
Рейтинг: 0 / 0
Метод с параметром List<int> в теле запрос Linq с условием Where
    #40007974
jeanssp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
Работает.....Но не понимаю как??? Благодарю
...
Рейтинг: 0 / 0
Метод с параметром List<int> в теле запрос Linq с условием Where
    #40008320
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jeanssp,

Используется статический метод расширения Join из пространства имен System.Linq
Он работает похожим образом с одноименным методом выборки в SQL (Cross Join)
То есть, возвращает пересечение\перемножение 2 множеств.
пример выше:
Код: c#
1.
IEnumerable<Foo> result = foos.Join(hashSet, p => p.Value, z => z, (p, z) => p);


сигнатура вызываемого метода:
Код: c#
1.
2.
IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, 
    Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector)

параметры:
0. foos - левый параметр, набор элементов типа <TOuter>, в текущем случае это IEnumerable<Foo>
1. hashSet - правый параметр, набор элементов <TInner>, в нашем случае это IEnumerable<int>
2. p => p.Value - это лямда функция селектор ключа для левого параметра, я указываю, что ключом элемента является поле Value
3. z => z - это лямбда функция селектор ключа для правого параметра, так как там простой тип int, я указываю, что ключом является сам объект множества
по этим ключам будет происходить сравнение, они должны быть сравниваемыми на равенство (наследовать интерфейс IEquatable)
4. (p, z) => p - это лямда функция возвращает результирующий объект типа <TResult>, p и z, это как раз те объекты которые пересеклись по ключам, я указываю, что мне нужен объект из левой части, значит TResult будет типа Foo

тут есть 1 момент, если у вас будет 2 объекта с одинаковым p.Value и 2 одинаковых ключа в правой коллекции, вы получите 4 объекта на выходе. Но так как правая часть у нас HashSet, то в ней все значения гарантировано уникальны, следовательно можно не переживать по этому множеству.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Метод с параметром List<int> в теле запрос Linq с условием Where
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]