Как использовать LINQ с рассчитанными свойствами за один проход? - PullRequest
1 голос
/ 21 января 2012

Я хотел бы сделать запрос LINQ, извлекая динамические свойства (вычисляемые поля) моих сущностей за один проход, без получения ошибки «Указанный тип члена EntityKey не поддерживается в LINQ to Entities».Вот единственный способ, который я нашел, но я уверен, что есть лучшие и более элегантные методы:

       var q = (from i in
                 (from x in context.Tickets
                    select new { x.OperatoreID, x.DataObiettivo })
                group i by new { i.OperatoreID } into g
                select new vmOperatoreDateObiettivo
                {
                    OperatoreID = g.Key.OperatoreID, 
                    NOperatore = "", // field value to be updated...
                    DataObiettivo = g.Max(d => d.DataObiettivo),
                    MinutiAllaScadenza = 0, // field to be updated...
                    Alert = "" // field value to be updated...
                }).ToList();

        // Here I update my fields with a second pass....

        foreach (vmOperatoreDateObiettivo e in q)
        {

            string nome = context.Operatori
                           .Where(t => t.OperatoreID == e.OperatoreID)
                           .First().CognomeNomePuntato.ToString();
            e.NOperatore = nome;
            int minscad = context.Tickets
                          .Where(t => t.OperatoreID == e.OperatoreID).AsEnumerable().Min(a => a.MinutiAllaScadenza);
            e.MinutiAllaScadenza = minscad;
            string sev = context.Tickets
                          .Where(t => t.OperatoreID == e.OperatoreID).AsEnumerable().Min(a => a.Alert);
            e.Alert = sev;             
        }

Заранее спасибо!

1 Ответ

0 голосов
/ 30 января 2012

Попробуйте добавить в свой запрос предложение let и определить вычисляемое поле, например так:

var q = (from i in
        (from x in context.Tickets
            select new { x.OperatoreID, x.DataObiettivo })
         group i by new { i.OperatoreID } into g
         let nOperatore = context.Operatori
                           .Where(t => t.OperatoreID == e.OperatoreID)
                           .First().CognomeNomePuntato.ToString() &&
            minutialla = context.Tickets
                            .Where(t => t.OperatoreID == e.OperatoreID)
                            .AsEnumerable().Min(a => a.MinutiAllaScadenza) &&
            alert = context.Tickets
                      .Where(t => t.OperatoreID == e.OperatoreID)
                      .AsEnumerable().Min(a => a.Alert)
         select new vmOperatoreDateObiettivo
         {
             OperatoreID = g.Key.OperatoreID, 
             NOperatore = nOperatore,
             DataObiettivo = g.Max(d => d.DataObiettivo),
             MinutiAllaScadenza = minutialla,
             Alert = alert
         }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...