不能使用Linq从具有分组的数据库表中选择记录

本文关键字:数据库 记录 选择 Linq 不能 | 更新日期: 2023-09-27 17:50:54

我试图选择一个SQL表和使用Linq到SQL,实体或对象分组列(我真的不知道什么。)我对Linq有点陌生,需要一些帮助。在我看来,代码结构是直接的。当我不添加GroupBy方法时,它工作得很好。顺便说一下,JT_Temp是一个实体模型。当我运行下面的代码时,它会出现异常:

实体或复杂类型'JT_Temp'不能在LINQ到实体查询中构造。

我已经尝试过这个和各种stackoverflow解决方案,但它们似乎不能解决并适用于我的情况。

下面是我当前的代码:

//Goal:
 //SELECT EnvelopeCode, Branch_COA, AQ_COA, AQ_Branch, SUM(Amount), AQ_PostStatus FROM JT_Temp
            //GROUP BY EnvelopeCode, Branch_COA, AQ_COA, AQ_Branch, AQ_PostStatus
//var csvFilteredRecord = Context.JT_Temp.SqlQuery("SELECT * FROM JT_Temp").ToList<JT_Temp>(); 
// GROUP BY -- No go; Manual SELECT -- No go;
            try
            {

                var csvFilteredRecord = (
                    from c in Context.JT_Temp
                    group c by new
                    {
                        c.EnvelopeCode,
                        c.Branch_COA,
                        c.AQ_COA,
                        c.AQ_Branch,
                        c.AQ_PostStatus
                    } into i
                    select new JT_Temp
                    {
                        EnvelopeCode = i.Key.EnvelopeCode,
                        Branch_COA = i.Key.Branch_COA,
                        AQ_COA = i.Key.AQ_COA,
                        AQ_Branch = i.Key.AQ_Branch,
                        //TO-DO SUM(Amount),
                        AQ_PostStatus = i.Key.AQ_PostStatus
                    }).ToList();
                foreach (var Record in csvFilteredRecord)
                {
                    Console.WriteLine(
                            Record.EnvelopeCode
                            + Record.Branch_COA
                            + Record.AQ_COA
                            //+ Record.Amount
                            + Record.AQ_PostStatus
                        );
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("---------- " + e.Message);
                Console.ReadLine();
            }

不能使用Linq从具有分组的数据库表中选择记录

你不能投影到JT_Temp。只需使用匿名对象。而且,没有理由做一个列表,所以我删除了.ToList()查询语法:

var csvFilteredRecord = (
                from c in Context.JT_Temp
                group c by new
                {
                    c.EnvelopeCode,
                    c.Branch_COA,
                    c.AQ_COA,
                    c.AQ_Branch,
                    c.AQ_PostStatus
                } into i
                select new 
                {
                    EnvelopeCode = i.Key.EnvelopeCode,
                    Branch_COA = i.Key.Branch_COA,
                    AQ_COA = i.Key.AQ_COA,
                    AQ_Branch = i.Key.AQ_Branch,
                    //TO-DO SUM(Amount),
                    AQ_PostStatus = i.Key.AQ_PostStatus
                });

方法语法:

var csvFilteredRecord = Context.JT_Temp.GroupBy(k=> new
  {
    c.EnvelopeCode,
    c.Branch_COA,
    c.AQ_COA,
    c.AQ_Branch,
    c.AQ_PostStatus
  },
  v=>v.Amount,
  (k,v)=>new {
    k.EnvelopeCode,
    k.Branch_COA,
    k.AQ_COA,
    k.AQ_Branch,
    k.AQ_PostStatus
    Amount=v.Sum()
  });
foreach (var Record in csvFilteredRecord)
{
  Console.WriteLine(
    Record.EnvelopeCode
    + Record.Branch_COA
    + Record.AQ_COA
    + Record.Amount
    + Record.AQ_PostStatus
  );
}