如何在一次过程中使用具有计算属性的LINQ

本文关键字:计算 属性 LINQ 过程中 一次 | 更新日期: 2023-09-27 18:21:00

我想进行一个LINQ查询,在一次传递中提取实体的动态属性(计算字段),而不会得到错误"LINQ to entities中不支持指定的类型成员'EntityKey'"。这是我找到的唯一工作方法,但我相信还有更好、更优雅的方法:

       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;             
        }

提前感谢!

如何在一次过程中使用具有计算属性的LINQ

尝试在查询中添加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();