Возвращение LINQ to Entity Query Result в виде строки JSON - PullRequest
1 голос
/ 04 февраля 2011

Я пытаюсь создать веб-сервис, который позволяет запросам RESTful возвращать LINQ to Entities в виде строковых данных JSON.У меня нет проблем с выполнением вызова базы данных, который возвращает один конкретный объект:

public Product GetTicket(string s)
        {
            int id = Convert.ToInt32(s);


MWAEntities context = new MWAEntities();
        var ticketEntity = (from p
                            in context.HD_TicketCurrentStatus
                            where p.Ticket_ID == id
                            select p).FirstOrDefault();
        if (ticketEntity != null)
            return TranslateTicketEntityToTicket(ticketEntity);
        else
            throw new Exception("Invalid Ticket ID");

        /**
        Product product = new Product();
        product.TicketId = 1;
        product.TicketDescription = "MyTest";
        product.TicketOperator = "Chad Cross";
        product.TicketStatus = "Work in Progress";
        return product;
        */
    }
    private Product TranslateTicketEntityToTicket(
        HD_TicketCurrentStatus ticketEntity)
    {
        Product ticket = new Product();
        ticket.TicketId = ticketEntity.Ticket_ID;
        ticket.TicketDescription = ticketEntity.F_PrivateMessage;
        ticket.TicketStatus = ticketEntity.L_Status;
        ticket.TicketOperator = ticketEntity.L_Technician;
        return ticket;
    }

Используя curl, я получаю данные json:

curl http://192.168.210.129:1111/ProductService/ticket/2
{"TicketDescription":"Firewall seems to be blocking her connection to www.rskco.com","TicketId":2,"TicketOperator":"Jeff","TicketStatus":"Completed"}

При этом я понятия не имеюкак получить строку объектов JSON, используя следующий запрос:

public List<MyTicket> GetMyTickets(string userId)
    {
        MWAEntities context = new MWAEntities();

        /**
         * List of statuses that I consider to be "open"
         * */
        string[] statusOpen = new string[] { "Work in Progress", "Assigned", "Unassigned" };

        /**
         * List of tickets with my userID
         * */
        var tickets = (from p
                       in context.HD_TicketCurrentStatus
                       where statusOpen.Contains(p.L_Status) & p.L_Technician == userId
                       select new MyTicket(p.Ticket_ID, p.Ticket_CrtdUser, p.F_PrivateMessage, p.Ticket_CrtdDate, p.L_Status));

        return ???;
    }

MyTicket - это тип, определенный следующим образом:

[DataContract]
public class MyTicket
{
    public MyTicket(int ticketId, string TicketCreator, string FirstPrivateMessage, DateTime TicketCreatedDate, string Status)
    {
        this.TicketId = ticketId;
        this.TicketCreator = TicketCreator;
        this.FirstPrivateMessage = FirstPrivateMessage;
        this.TicketCreatedDate = TicketCreatedDate;
        this.Status = Status;
    }
    [DataMember]
    public int TicketId { get; set; }       

    [DataMember]
    public string TicketCreator { get; set; }

    [DataMember]
    public string FirstPrivateMessage { get; set; }

    [DataMember]
    public DateTime TicketCreatedDate { get; set; }

    [DataMember]
    public string Status { get; set; }

    //p.Ticket_CrtdUser, p.Ticket_CrtdDate, p.Ticket_ID, p.F_PrivateMessage
}

Я просто хотел бы получить список строк JSONв качестве вывода для анализа с использованием JS.Я попытался использовать цикл foreach для разбора «var» в список объектов MyTicket, вызывая .ToList ()) и т. Д., Но безрезультатно.

Я не могу изменить бэкэнд (SQL 2005/2008)), но я пытаюсь использовать стандартный клиент HTML / JS для использования веб-службы .NET 4.0.Любая помощь будет принята с благодарностью.Я провел буквально дни в поисках и чтении книг (особенно на сайте Safari О'Рейли), и я не нашел разумного решения: (.

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

используйте Json.NET: http://james.newtonking.com/pages/json-net.aspx

using Newtonsoft.Json;

var serializer = new JsonSerializer();
serializer.Serialize(Response.Output, tickets); // per your example

РЕДАКТИРОВАТЬ: Argh, выше, если вы хотите обрабатывать сериализацию самостоятельно.

В вашем примере измените возврат метода с List на Ticket [] и выполните

return tickets.ToArray();
0 голосов
/ 25 апреля 2011

Я хотел добавить, что со временем мне помогли решить эту проблему. Я не использую бизнес-объекты, хотя я использую Entity Framework. Это не может быть мудрым решением, но я все больше путаюсь с Linq2SQL и Linq2EF. Вот код, который сделал вышеупомянутую работу:

public List<MyTicket> GetMyTickets(string userId)
    {
        MWAEntities context = new MWAEntities();

        /**
         * List of statuses that I consider to be "open"
         * */
        string[] statusOpen = new string[] { "Work in Progress", "Created"};

        var tickets = (from p
                       in context.HD_TicketCurrentStatus
                       where statusOpen.Contains(p.L_Status) & p.L_Technician == userId
                       select new MyTicket{
                           TicketId = p.Ticket_ID,
                           TicketCreatedDate = p.Ticket_CrtdDate,
                           FirstPrivateMessage = p.F_PrivateMessage,
                           Status = p.L_Status,
                           TicketCreator = p.Ticket_CrtdUser
                       });
        return tickets.ToList();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...