2009-08-08 6 views
7

Chciałbym przekonwertować listę właściwości użytkownika do strings tablicy (dla odbiornika json) jak:Jak uzyskać wynik linq jako ciąg tablicy?

List<User> users = <..list of users from db...> 

var jsonData = (
    from user in users 
    select new { user.Id, user.Person.Lastname, user.Person.Firstname }); 

return Json(jsonData) 

wynik jest tablicą nazwie pola

[{"Id":1,"Lastname":"Doe","Firstname":"John"},{"Id":2,"Lastname":"Smith","Firstname":"Adam"},...] 

ale chciałbym go mieć tablica tablic zwykłych ciągów takich jak:

[["1","Doe","John"] 
["2","Smith","Adam"], ...] 

Jak rzutować wyniki linq na tablicę ciągów znaków?

Odpowiedz

17
var jsonData = from user in users 
       select new[] { user.Id.ToString(), 
           user.Person.Lastname, 
           user.Person.Firstname }; 

Alternatywnie, można wykorzystywać składnię lambda

var jsonData = users.Select(user => new[] { user.Id.ToString(), 
              user.Person.Lastname, 
              user.Person.Firstname }); 
+0

dziękuję, obie twoje propozycje działają dobrze :) W każdym razie, próbowałem już wcześniej takiej tablicy, ale skończyłem z dziwnymi błędami indeksu. Tak samo było z twoim kodem, wtedy zdałem sobie sprawę, że moje źródło danych zwróciło obiekt IQueryable, który był problemem - users.ToList() to rozwiązał. W każdym razie Twoja odpowiedź była pomocna, aby to uzyskać. Dzięki. – twk

+0

FYI, to dokładne rozwiązanie nie działało dla mnie, ponieważ miałem mieszane typy numeryczne. (Otrzymałem komunikat, że kompilator nie mógł określić typu tablicy.) Ale użyłem "nowego obiektu []" i to rozwiązało mój problem. – mpontillo

+0

@Mike: Tak, właśnie dlatego nazwałem '.ToString()' na 'user.Id', co do którego zakładałem, że jest liczbą całkowitą. Aby 'nowy []' działał, kompilator powinien móc wywnioskować typ tablicy z przekazanych do niej obiektów. Jeśli ich typy nie są kompatybilne, kompilator będzie narzekał. –

0

ja przy użyciu IQueryable jako punkt rozpoczęcia tworzenia macierzy wartości, a nie List<>, ale w każdym przypadku można uszeregować anonimowa tablica obiektów, zamiast tablic ciągów znaków, aby uzyskać ten sam wynik bez rzutowania wartości na ciągi znaków.:

np.

var jsonData = users.Select(user => new object[] { 
        user.Id, 
        user.Person.Lastname, 
        user.Person.Firstname 
       }); 

W moim przypadku ja też używając wynik po stronie klienta z jQuery dataTable, więc wynik musiał być owinięte w innym anonimowym obiektu (z nazwą własności aadata).

np.

return Json(new { aaData = jsonData }, JsonRequestbehavior.AllowGet); 

Mam nadzieję, że to pomoże innym, że znaleźć na to pytanie szuka dataTable konkretnej wersji tego problemu (jak ja).