Linq to Entities Выберите предложение с лямбда - PullRequest
5 голосов
/ 02 сентября 2011

Я работаю над новым проектом, и мы используем Entity Framework, и ведущий разработчик хотел бы использовать лямбда-запросы, когда это возможно. Нам трудно понять, как выбрать два столбца. Также как выбрать отличное. У нас есть таблица с несколькими записями для поставщика, но мы хотим просто получить список поставщиков и загрузить их в объект словаря. Сбой, потому что, как написано, он пытается добавить значение ключа, которое уже было добавлено. Возьмите следующий запрос.

Dictionary<int, string> dict = new Dictionary<int, string>();
        dict = GetWamVendorInfo().AsEnumerable()
                    .Where(x => x.vendor_name != null && x.vendor_id != null)
                    //.Select(x => x.vendor_id).Distinct()
                    .Take(2)
                    .ToDictionary(o => int.Parse(o.vendor_id.ToString()), o => o.vendor_name);

То, что я хотел бы сделать, это выбрать просто vendor_id и vendor_name, чтобы мы могли получить только отдельные записи.

Любая помощь будет принята с благодарностью.

Спасибо

1010 * Рхонда *

Ответы [ 2 ]

9 голосов
/ 02 сентября 2011

Используйте анонимный тип:

// earlier bit of query
.Select(x => new { VendorId = x.vendor_id, VendorName = x.vendor_name } )
.Distinct()
.ToDictionary(o => o.VendorId, o => o.VendorName);

Я удалил вызов на Take(2), так как не было понятно, зачем вам это нужно, а также удалил синтаксический анализ VendorId, который, как я ожидал, уже был целочисленным типом.

Обратите внимание, что вы должны почти определенно удалить вызов AsEnumerable из вашего запроса - в настоящее время вы будете получать всех поставщиков и выполнять фильтрацию с помощью LINQ to Objects. Также нет смысла создавать пустой словарь, а затем полностью его игнорировать. Я подозреваю, что ваш полный запрос должен быть:

var vendors = GetWamVendorInfo()
                      .Select(x => new { VendorId = x.vendor_id,
                                         VendorName = x.vendor_name } )
                      .Distinct()
                      .ToDictionary(o => o.VendorId,
                                    o => o.VendorName);

Кроме того, вы должны спросить своего ведущего разработчика , почему он хочет везде использовать лямбда-выражения (предположительно, в отличие от выражений запросов). В разных ситуациях получается более читаемый код с использованием различных синтаксических опций - в этом плане стоит проявить гибкость.

4 голосов
/ 02 сентября 2011

Просто используйте анонимный объект:

var vendors = GetWamVendorInfo().AsEnumerable()
                .Where(x => x.vendor_name != null && x.vendor_id != null)
                .Select(new {x.vendor_id, x.vendor_name})
                .Take(2)

Вот и все. Теперь вы можете работать с vendors[0].vendor_id, vendors[0].vendor_name и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...