428 Stimmen

Die Entität kann nicht in einer LINQ to Entities-Abfrage erstellt werden

Es gibt einen Entitätstyp namens Product die vom Entity Framework generiert wird. Ich habe diese Abfrage geschrieben

public IQueryable<Product> GetProducts(int categoryID)
{
    return from p in db.Products
           where p.CategoryID== categoryID
           select new Product { Name = p.Name};
}

Der folgende Code führt zu folgendem Fehler:

"Die Entität oder der komplexe Typ Shop.Product kann nicht in einem LINQ to Entities-Abfrage erstellt werden"

var products = productRepository.GetProducts(1).Tolist();

Aber wenn ich die select p anstelle von select new Product { Name = p.Name}; es funktioniert richtig.

Wie kann ich einen benutzerdefinierten Auswahlbereich erstellen?

4voto

Mohamed Adam Punkte 49

Sie können dies verwenden und es sollte funktionieren --> Sie müssen Folgendes verwenden toList bevor Sie die neue Liste mit select erstellen:

db.Products
    .where(x=>x.CategoryID == categoryID).ToList()
    .select(x=>new Product { Name = p.Name}).ToList();

1voto

JollyBrackets Punkte 521

Als Antwort auf die andere Frage, die als Duplikat markiert wurde ( siehe hier ) Ich habe eine schnelle und einfache Lösung auf der Grundlage der Antwort von Soren gefunden:

data.Tasks.AddRange(
    data.Task.AsEnumerable().Select(t => new Task{
        creator_id   = t.ID,
        start_date   = t.Incident.DateOpened,
        end_date     = t.Incident.DateCLosed,
        product_code = t.Incident.ProductCode
        // so on...
    })
);
data.SaveChanges();

Anmerkung: Diese Lösung funktioniert nur, wenn Sie eine Navigationseigenschaft (Fremdschlüssel) für die Aufgabenklasse (hier 'Incident' genannt) haben. Wenn Sie diese nicht haben, können Sie einfach eine der anderen geposteten Lösungen mit "AsQueryable()" verwenden.

1voto

Jelman Punkte 772

Sie können dieses Problem durch die Verwendung von Datentransferobjekten (DTOs) lösen.

Diese sind ein bisschen wie Viewmodels, in die man die benötigten Eigenschaften einträgt und die man manuell in seinem Controller oder mit Hilfe von Drittanbieterlösungen wie AutoMapper zuordnen kann.

Mit DTOs können Sie :

  • Daten serialisierbar machen (Json)
  • Beseitigen Sie zirkuläre Verweise
  • Verringern Sie den Netzverkehr, indem Sie Eigenschaften, die Sie nicht benötigen, zurücklassen (viewmodelwise)
  • Objektverflachung verwenden

Ich habe das in diesem Jahr in der Schule gelernt, und es ist ein sehr nützliches Werkzeug.

0voto

vikas suhag Punkte 1

Wenn Sie Entity-Framework verwenden, dann versuchen Sie, die Eigenschaft von DbContext zu entfernen, die Ihr komplexes Modell als Entität verwendet Ich hatte dasselbe Problem, als ich mehrere Modelle in ein Viewmodel mit dem Namen Entity abbildete

public DbSet<Entity> Entities { get; set; }

Durch das Entfernen des Eintrags aus DbContext wurde der Fehler behoben.

0voto

Basheer AL-MOMANI Punkte 13273

Wenn Sie Executing Linq to Entity können Sie nicht mit dem ClassType con new en el select Abschluss der Abfrage only anonymous types are allowed (new without type)

Sehen Sie sich diesen Ausschnitt aus meinem Projekt an

//...
var dbQuery = context.Set<Letter>()
                .Include(letter => letter.LetterStatus)
                .Select(l => new {Title =l.Title,ID = l.ID, LastModificationDate = l.LastModificationDate, DateCreated = l.DateCreated,LetterStatus = new {ID = l.LetterStatusID.Value,NameInArabic = l.LetterStatus.NameInArabic,NameInEnglish = l.LetterStatus.NameInEnglish} })
                               ^^ without type__________________________________________________________________________________________________________^^ without type

von Ihnen die new keyword in Select closure auch auf der complex properties erhalten Sie diese Fehlermeldung

also remove die ClassTypes from new Stichwort zu Linq to Entity Abfragen ,,

weil es in eine Sql-Anweisung umgewandelt und auf dem SqlServer ausgeführt wird

also wann kann ich die new with types en select Abschluss?

Sie können es verwenden, wenn Sie mit folgenden Themen zu tun haben LINQ to Object (in memory collection)

//opecations in tempList , LINQ to Entities; so we can not use class types in select only anonymous types are allowed
var tempList = dbQuery.Skip(10).Take(10).ToList();// this is list of <anonymous type> so we have to convert it so list of <letter>

//opecations in list , LINQ to Object; so we can use class types in select
list = tempList.Select(l => new Letter{ Title = l.Title, ID = l.ID, LastModificationDate = l.LastModificationDate, DateCreated = l.DateCreated, LetterStatus = new LetterStatus{ ID = l.LetterStatus.ID, NameInArabic = l.LetterStatus.NameInArabic, NameInEnglish = l.LetterStatus.NameInEnglish } }).ToList();
                                ^^^^^^ with type 

nachdem ich ausgeführt habe ToList auf Anfrage wurde es in memory collection Wir können also verwenden new ClassTypes in ausgewählten

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X