2016-10-26 2 views
0

Ich erhalte den folgenden Fehler: "Ausdruck konnte nicht übersetzt werden ...", wenn ich versuche, eine Liste von Anfrageeinheiten zurückzugeben, die in eine benutzerdefinierte Klasse konvertiert wurden.Ausdruck konnte nicht übersetzt werden

Ich bin sehr neu in der Verwendung von Link auf diese Weise, in der Vergangenheit würde ich gespeicherte Prozedur in SQL verwenden und importieren Sie sie nur als Methoden, aber ich versuche, diese zu konvertieren.

Meine Methode, die eine Liste zurückgibt, ist:

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

Und die benutzerdefinierte Klasse ist:

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

Meine Frage ist 2-fach 1. Gibt es eine bessere Art und Weise Tabellen miteinander zu verbinden, in Linq als ich oben mache? 2. Was könnte den Fehler verursachen, habe ich nichts dagegen, es herauszufinden, aber nicht sicher, wie man das sogar angehen.

EDIT: Dies ist definitiv kein Duplikat der genannten Frage. Die einzige Ähnlichkeit zwischen den 2 ist die Verwendung von Shortdatestring, jedoch ist die Fehlermeldung, die ich erhalte, völlig anders als die der anderen Frage.

+0

kann Ihnen sagen, was ist das Problem, wenn Sie einfach so tun 'wählen a' anstelle der benutzerdefinierten Klasse mapper.tell uns? – Sampath

+0

Wenn Sie a auswählen, werden die Datensätze ohne Ausnahmen übernommen. Ich vermute also, dass es eine Konvertierung ist, mit der es nicht zufrieden ist. – ThatChris

+0

context.Database.Log = (sw) => Debug.WriteLine (sw); Sie können diese Zeile vor der Deklaration Ihrer Abfrage einfügen. und check in Ausgabefenster in VS für übersetzte Abfrage und Ausnahme. Wo Kontext ist Ihr DbContext Name – Raghu

Antwort

1

Sie viel c# Methoden verwendet haben, die von der SQL.Hence nicht bekannt sind, können Sie alle Spalten abrufen, wie unten dargestellt, und dann tun Ihre benutzerdefinierte Zuordnung auf dem Speicher, wie Sie möchten.

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() 

Danach machen Sie Ihre eigene Klasse Mapping hier:

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

1.Wenn diese Abfrage ausgeführt wird, muss Linq Compiler diese Linq-Abfragen in SQL-Abfrage umwandeln. Die meisten der Methoden, die IQuerable-Schnittstelle implementieren, können konvertierbar sein. aber C# -Methoden wie ToString(), ToShortDateString() konnten nicht von Linq-Compiler konvertiert werden. Sie erhalten also 'Konnte Ausdruck nicht übersetzen ..'.

-1

Sie könnten versuchen:

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 

etc ..

+0

Würde das nicht zu einem inneren Join statt zu einem Link führen? Zumindest war das mein Verständnis? – ThatChris

Verwandte Themen