Linq возвращает IEnumerable <Dictionary <строка, строка >> - PullRequest
5 голосов
/ 01 августа 2010

Мне нужно вернуть IEnumerable из динамически создаваемого словаря.

псевдокод:

var x = from u in Users

select new dictionary<string, string>{
    Add("Name",u.Name),
    Add("LastName",u.LastName)
}

Я пробовал много способов получить приведенный выше пример псевдокода, но безуспешно ...

Буду очень признателен за вашу помощь.

Ответы [ 4 ]

7 голосов
/ 01 августа 2010
var x = from u in Users
        select new Dictionary<string, string> {
            { "Name", u.Name },
            { "LastName", u.LastName }
        };
4 голосов
/ 04 августа 2010

Ошибка «Нераспознанный узел выражения» возникает из-за того, что LINQ to SQL не может превратить связанный со словарем код в SQL.Вы можете использовать AsEnumerable(), чтобы компилятор использовал LINQ to Objects вместо:

var x = from u in Users.AsEnumerable()
        select new Dictionary<string, string> {
            { "Name", u.Name },
            { "LastName", u.LastName }
        };
1 голос
/ 01 августа 2010

Способ конвертации:

public Dictionary<string, string> ToPropertyDictionary(User theUser)
{
  Dictionary<string, string> result = new Dictionary<string, string>();
  result.Add("Name", theUser.Name);
  result.Add("LastName", theUser.Name);
  return result;
}

Вызывается:

IEnumerable<Dictionary<string, string>> x =
  from u in Users.AsEnumerable()  //ensure local execution by using AsEnumerable
  select ToPropertyDictionary(u);
1 голос
/ 01 августа 2010

Это плохое использование словаря - вы используете его только как набор свойств и создаете столько словарей, сколько пользователей.
Лучше использовать язык, создав собственный класс User с этими свойствами и использовать его:

public class User
{
    public string Name { get; set; }
    public string LastName { get; set; }
}

И запрос:

var users = Users.Select(u => new User
            {
                Name = u.Name,
                LastName = u.LastName
            });

Если вы будете использовать только коллекцию, содержащую ваш метод, другой вариант - создать анонимный класс:

var users = Users.Select(u => new { Name = u.Name, LastName = u.LastName });
...