【问题标题】:Could not translate expression [duplicate]无法翻译表达式[重复]
【发布时间】:2016-10-26 08:37:46
【问题描述】:

当我尝试返回已转换为自定义类的查询实体列表时,出现以下错误:“无法翻译表达式...”。

我对以这种方式使用链接非常陌生,过去我会在 SQL 中使用存储过程并将它们作为方法导入,但我正在尝试转换它们。

我返回列表的方法是:

public static List<EnquiryData> GetAllEnquiries()
{
    var GridData = from a in Global.AcepakSalesPortal.Enquiries
                   join Cust in Global.AcepakSalesPortal.Customers
                       on a.CustomerID equals Cust.CustomerID into CustGroup
                   from b in CustGroup.DefaultIfEmpty()
                   join Pros in Global.AcepakSalesPortal.Prospects
                       on a.ProspectID equals Pros.ProspectID into ProsGroup
                   from c in ProsGroup.DefaultIfEmpty()
                   join Users in Global.AcepakSalesPortal.Users
                       on a.ResponsiblePartyID equals Users.UserID into UserGroup
                   from d in UserGroup.DefaultIfEmpty()
                   join Qt in Global.AcepakSalesPortal.Quotes
                       on a.QuoteID equals Qt.QuoteID into QuoteGroup
                   from e in QuoteGroup.DefaultIfEmpty()
                   join Usr in Global.AcepakSalesPortal.Users
                       on e.CreatedBy equals Usr.UserID into UsrGroup
                   from f in UsrGroup.DefaultIfEmpty()
                   join EnqCat in Global.AcepakSalesPortal.EnquiryCategories
                       on a.EnquiryCategoriesID equals EnqCat.EnquiryCatID into CatGroup
                   from g in CatGroup.DefaultIfEmpty()
                   join Clsd in Global.AcepakSalesPortal.Users
                       on a.ClosedBy equals Clsd.UserID into ClsdGroup
                   from h in ClsdGroup.DefaultIfEmpty()
                   orderby a.Created descending
                   select new EnquiryData
                   {
                       EnquiryID = a.EnquiryID,
                       ResponsiblePartyID = a.ResponsiblePartyID,
                       EnquiryNo = "ENQ" + a.EnquiryID.ToString().PadLeft(7, '0'),
                       EType = a.CustomerID.HasValue ? "C" : "P",
                       EnqCat = g.Code + " - " + g.Category,
                       ContactPerson = a.ProspectID.HasValue ? c.ContactPerson : "NOT INTEGRATED YET",
                       ContactNumber = a.ProspectID.HasValue ? c.ContactNum : "NOT INTEGRATED YET",
                       ContactEmail = a.ProspectID.HasValue ? c.ContactEmail : "NOT INTEGRATED YET",
                       Company = a.CustomerID.HasValue ? b.Name : c.CompanyName,
                       Description = a.Description,
                       AssignedTo = d.Name,
                       AddressBy = a.AddressBy,
                       EnquiryDate = a.Created,
                       EStatus = a.Closed.HasValue ? "Closed" : a.QuoteID.HasValue ? "Quoted" : "Open",
                       QuotedOn = a.QuoteID.HasValue ? e.Created.ToShortDateString() : "N/A",
                       QuotedBy = a.QuoteID.HasValue ? f.Name : "N/A",
                       QuoteNum = a.QuoteID.HasValue ? e.QuoteID.ToString().PadLeft(7, '0') : "N/A",
                       ClosedOn = a.Closed.HasValue ? a.Closed.Value.ToShortDateString() : "N/A",
                       ClosedBy = a.Closed.HasValue ? h.Name : "N/A",
                       Reason = a.Closed.HasValue ? a.ClosedReason : "N/A"
                   };

    return GridData.ToList();
}

而自定义类是:

public class EnquiryData
{
    public int EnquiryID { get; set; }
    public int ResponsiblePartyID { get; set; }
    public string EnquiryNo { get; set; }
    public string EType { get; set; }
    public string EnqCat { get; set; }
    public string ContactPerson { get; set; }
    public string ContactNumber { get; set; }
    public string ContactEmail { get; set; }
    public string Company { get; set; }
    public string Description { get; set; }
    public string AssignedTo { get; set; }
    public DateTime AddressBy { get; set; }
    public DateTime EnquiryDate { get; set; }
    public string EStatus { get; set; }
    public string QuotedOn { get; set; }
    public string QuotedBy { get; set; }
    public string QuoteNum { get; set; }
    public string ClosedOn { get; set; }
    public string ClosedBy { get; set; }
    public string Reason { get; set; }
}

我的问题是 2 倍 1.有没有比我上面做的更好的方法在 Linq 中将表连接在一起? 2. 什么可能导致错误,我不介意弄清楚但不知道如何解决这个问题。

编辑:这绝对不是上述问题的重复。两者之间唯一的相似之处是使用了shortdatestring,但是我收到的错误消息与另一个问题的错误消息完全不同。

【问题讨论】:

  • 你能告诉我们当你这样做select a而不是自定义类映射器时有什么问题吗?告诉我们?
  • 当使用 select a 时,它会毫无例外地使记录顺利通过。所以我猜这是一些它不满意的转换。
  • context.Database.Log = (sw)=>Debug.WriteLine(sw);您可以在声明查询之前包含此行。并在 VS 的输出窗口中检查已翻译的查询和执行。其中 context 是您的 DbContext 名称

标签: c# entity-framework linq linq-to-sql


【解决方案1】:

您使用了许多 SQL 不知道的 c# 方法。因此您可以检索所有列,如下所示,然后根据需要在内存上进行自定义映射。

var GridData = (from a in Global.AcepakSalesPortal.Enquiries
                   join Cust in Global.AcepakSalesPortal.Customers
                       on a.CustomerID equals Cust.CustomerID into CustGroup
                   from b in CustGroup.DefaultIfEmpty()
                   join Pros in Global.AcepakSalesPortal.Prospects
                       on a.ProspectID equals Pros.ProspectID into ProsGroup
                   from c in ProsGroup.DefaultIfEmpty()
                   join Users in Global.AcepakSalesPortal.Users
                       on a.ResponsiblePartyID equals Users.UserID into UserGroup
                   from d in UserGroup.DefaultIfEmpty()
                   join Qt in Global.AcepakSalesPortal.Quotes
                       on a.QuoteID equals Qt.QuoteID into QuoteGroup
                   from e in QuoteGroup.DefaultIfEmpty()
                   join Usr in Global.AcepakSalesPortal.Users
                       on e.CreatedBy equals Usr.UserID into UsrGroup
                   from f in UsrGroup.DefaultIfEmpty()
                   join EnqCat in Global.AcepakSalesPortal.EnquiryCategories
                       on a.EnquiryCategoriesID equals EnqCat.EnquiryCatID into CatGroup
                   from g in CatGroup.DefaultIfEmpty()
                   join Clsd in Global.AcepakSalesPortal.Users
                       on a.ClosedBy equals Clsd.UserID into ClsdGroup
                   from h in ClsdGroup.DefaultIfEmpty()
                   orderby a.Created descending
                   select a).ToList()

之后在此处进行自定义类映射:

var list= GridData.Select(a=>new EnquiryData{EnquiryID = a.EnquiryID,.... }) 

【讨论】:

    【解决方案2】:

    1.当这些查询执行时,linq编译器需要将这个linq查询转换为SQL查询。大部分实现IQerable inferface的方法,都是可以转换的。但是像 ToString() 、 ToShortDateString() 这样的 C# 方法无法通过 Linq 编译器进行转换。所以你会得到“无法翻译表达式..”。

    【讨论】:

      【解决方案3】:

      你可以试试:

      var GridData = from a in Global.AcepakSalesPortal.Enquiries
                         join Cust in Global.AcepakSalesPortal.Customers on a.CustomerID equals Cust.CustomerID 
                         join Pros in Global.AcepakSalesPortal.Prospects on a.ProspectID equals Pros.ProspectID 
                         join Users in Global.AcepakSalesPortal.Users on a.ResponsiblePartyID equals Users.UserID 
      

      等等。

      【讨论】:

      • 这不会导致内连接而不是左连接吗?至少这是我的理解?
      猜你喜欢
      • 2021-07-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 2021-10-13
      • 2022-10-20
      • 1970-01-01
      相关资源
      最近更新 更多