Фильтр словаря, содержащего сложный тип, с помощью LINQ
Привет,
Я работаю с API, который предоставляет мне следующую коллекцию:
Dictionary<string,list<product>>
Ключ - это код продукта, а значение-это список, содержащий фактический объект продукта.
Сущность Product в приложении C# содержит следующие свойства:
код продукта
название продукта
Product_DESC
код изделия
вид продукции
Сущность Product_TYPE в приложении C# является сложным типом и содержит следующие свойства:
Product_TYPE_CODE
Product_TYPE_DESC
Product_Code и Product_Type могут быть null, потому что эти столбцы в базе данных также могут быть установлены в null.
Конечный пользователь в моем приложении предоставляет список Product_codes и / или Product_types. Теперь что касается списка ProductType, то если значение "неизвестно", я хотел бы сопоставить это значение с нулевым значением для этого конкретного свойства и заменить его на"неизвестно".
Итак, скажем, у меня есть список ProductTypes, и этот список содержит значение "UNKNOWN", которое я хочу сопоставить со свойством ProductType сущности C#.
Как я могу сделать это с помощью LINQ?
Я ценю помощь/совет относительно вышеизложенного.
Что я уже пробовал:
Я попробовал следующий код, который приходит из API, но у меня возникли трудности с использованием LINQ для фильтрации продуктов, используя предоставленный список ProductTypes и ProductCodes и заменяя свойство ProductType:
var loadedProducts = ProductFactory.Способность();
Этот метод, по сути, получает продукты из БД и кэширует их соответствующим образом. Возвращаемое значение при вызове этого метода
Dictionary<string,list<product>>()
Подходит ли LINQ для использования в этом контексте или это не очень хорошая идея использовать LINQ?
Я могу отфильтровать продукты по PRODUCT_CODE и PRODUCT_TYPE, выполнив следующие действия в SQL(это все еще находится в стадии разработки, но я хотел продемонстрировать, что я могу сделать до сих пор в SQL).
SELECT PRODUCT_ID, PRODUCT_CODE, COALESCE(PRODUCT_TYPE, 'UNKNOWN') as PRODUCT_TYPE, PRODUCT_DESC, FROM PRODUCTS WHERE PRODUCT_CODE IN ('TYAHAH','ABH989') AND COALESCE(PRODUCT_TYPE, 'UNKNOWN') IN ('ABC','UNKNOWN');
Midi_Mick
Вы почти наверняка можете делать с linq все, что хотите, - я просто не уверен, чего вы ожидаете в результате. У вас есть свой словарь, который имеет значение, которое представляет собой список продуктов. Учитывая ваши входные данные, вам нужен только один список продуктов, собранных из всех списков, или вам нужен список ключей, с которыми связан список продуктов, соответствующих вашим входным данным, или, может быть, список списков, каждый из которых содержит продукт, соответствующий вашим критериям?
Кроме того, вы говорите, что ключ вашего словаря-это PRODUCT_CODE, а PRODUCT_CODE может быть нулевым. Недопустимо иметь ключ словаря null, поэтому я предполагаю, что вы уже перевели его в "неизвестный", прежде чем создавать словарь.
Eagle32
Извините, я обновил свою фактическую проблему и свой SQL.
Я проверил API, Product_Code на самом деле всегда заполняется в базе данных и будет содержать реальное значение (то есть не "неизвестно"), а Product_Type не всегда заполняется фактическим значением.
Что я хотел бы сделать, так это отфильтровать коллекцию словарей и вернуть только список "продуктов". Я хочу, чтобы отфильтровать с помощью пользовательского списка ProductCodes и список ProductTypes.
Я хочу сопоставить код продукта с помощью списка ProductCodeList, предоставленного конечным пользователем. Этот список никогда не будет содержать "неизвестного".
Теперь что касается пользовательского списка providedlist, называемого Producttypes List, то если значение содержит "UNKNOWN", я хочу сопоставить нулевое значение свойства ProductType продукта, существующего в этом списке "product" в словаре, который я упомянул. Затем я хочу заменить нулевое значение свойства на "UNKNOWN".
BillWoodruff
Путаница: вы говорите о словаре .NET, вы говорите о списках.
Пожалуйста, уточните, какого именно результата вы хотите достичь. Вы спрашиваете о том, как создать запрос к базе данных, который возвращает набор данных "сложных объектов", или вы спрашиваете о том, чтобы взять словарь .NET в качестве своего "источника" и что-то сделать с ним с помощью Linq. Почему вы показали код SQL-запроса ? Откуда берутся "списки"? Вы создали классы, которые описываете ?
Eagle32
Извините, я обновил свою фактическую проблему и свой SQL. Я посмотрел на API, с которым работаю, и код продукта в таблице Products всегда заполнен и, следовательно, никогда не равен нулю.
Однако ProductType может быть null, и данные, с которыми я работаю, имеют несколько записей, в которых ProductType равен NULL. Я хочу сопоставить это значение, и если значение равно NULL, а значение в предоставленном пользователем списке ProductTypes равно "UNKNOWN", я хочу заменить значение ProductType, где значение равно NULL, которое существует в словаре<string, list<product="">"На " UNKNOWN".
Я спрашиваю, как бы я отфильтровал данные, которые я получаю обратно, на основе предоставленных Пользователем входных данных, где структура данных возвращаемого значения имеет следующий формат Dictionary< string, list< product="">>();