LINQ to Entities中不支持指定的类型成员

本文关键字:类型 成员 不支持 to Entities LINQ | 更新日期: 2024-09-19 22:47:57

我正试图通过保险单付款进行分组,这些付款在主保单和子保单之间分配(下面是policy.ID和policy.POL2)。理想情况下,我想要最后3笔付款,到期日、付款日期、金额和一个暂记金额,无论付款是否分割。

如果付款是分开的,我需要将支付给主保单和子保单的金额相加,但其他三个字段应该相同,所以我不想要重复的记录。

我以为这样的东西会起作用,但我得到了

LINQ to中不支持指定的类型成员"PAYDUE"实体。仅初始值设定项、实体成员和实体导航属性。

因为PAYDUE是一个DateTime。正如您所看到的,我尝试使用内置的EntityFunctions方法,但仍然得到相同的错误

var mc = new ModelContext();
var policy = mc.Polmasts.Find("N400603");
var payments = from p in mc.Paymnts
               where p.POLICY == policy.ID ||
                     p.POLICY == policy.POL2
               orderby p.PAYPD_ descending
               group p by p.PAYPD_
               into g
               select new 
                       {
                           payduedate = EntityFunctions.TruncateTime(g.FirstOrDefault().PAYDUE),
                           paypaiddate = EntityFunctions.TruncateTime(g.FirstOrDefault().PAYPD),
                           paymentamount = g.Sum(a=>a.AMOUNT),
                           paysuspense = g.FirstOrDefault().SUSP
                       };
foreach (var payment in payments)
{
    Console.WriteLine("%=========== 'n PAY DUE DATE: {0} 'n PAYMENT DATE: {1} 'n AMOUNT: {2} 'n SUSPENSE: {3}", payment.payduedate, payment.paypaiddate, payment.paymentamount, payment.paysuspense);
}

LINQ to Entities中不支持指定的类型成员

看看这个问题。我猜PAYDUE不是表模式的一部分?

您可以尝试分离出最终的选择,以便在执行选择之前实现表。像这样的东西(不过我还没有测试过!)

var paymentsRaw = (from p in mc.Paymnts
               where p.POLICY == policy.ID ||
                     p.POLICY == policy.POL2
               orderby p.PAYPD_ descending
               group p by p.PAYPD_).ToList();
var payments = from g in paymentsRaw 
               select new 
                       {
                           payduedate = EntityFunctions.TruncateTime(g.FirstOrDefault().PAYDUE),
                           paypaiddate = EntityFunctions.TruncateTime(g.FirstOrDefault().PAYPD),
                           paymentamount = g.Sum(a=>a.AMOUNT),
                           paysuspense = g.FirstOrDefault().SUSP
                       };