2010-06-01 9 views
8

Wie der Titel schon sagt, ich habe die folgende Ausnahme:explizite Konstruktion Entitätstyp [MyClass] in Abfrage nicht erlaubt ist

Beschreibung: Ereigniscode: 3005 Ereignis Nachricht: Eine nicht behandelte Ausnahme ist aufgetreten. Ausnahmeinformationen: Ausnahmetyp: NotSupportedException Ausnahmebedingungsnachricht: Explizite Konstruktion des Entitätstyps 'Company.Project.Core.Domain.Friend' in Abfrage ist nicht zulässig.

ich LINQ to SQL bin mit und habe den folgenden Code in meinem Datacontext:

var friends2 = (
    from f in dc.Friends 
    where f.MyFriendsAccountId == accountId 
    where f.AccountId != accountId 
    select new 
    { 
     f.FriendId, 
     AccountId = f.MyFriendsAccountId, 
     MyFriendsAccountId = f.AccountId, 
     f.CreateDate, 
     f.Timestamp 
    }).Distinct(); 

result.AddRange(
    from o in friends2 
    select new Friend() 
    { 
     FriendId = o.FriendId, 
     AccountId = o.AccountId, 
     CreateDate = o.CreateDate, 
     MyFriendsAccountId = o.MyFriendsAccountId, 
     Timestamp = o.Timestamp 
    }); 

der letzte Codeblock den Fehler zu werfen, und ich bin ziemlich sicher, dass es diese Aussage ist , dass der Täter :

.Select(o => **new Friend** 

Wie sollte ich meinen Code überarbeiten, um diesen Fehler zu vermeiden?

+0

Beantwortet hier: http://stackoverflow.com/questions/787296/explicit-construction-of-entity-type-in-query-is-not-alowed –

+0

Danke, aber ich bin immer noch nicht ganz klar. Ich würde mich über eine Illustration in Anbetracht meiner besonderen Situation freuen. Vielen Dank. –

Antwort

11

Entitäten, die Teil des Datenkontexts sind, können nicht mit einer LINQ-Abfrage erstellt werden. Dies ist eine durchdachte Designentscheidung des C# -Teams. Da die Entitäten in der Select-Anweisung neu erstellt werden (manuell), würde dies bedeuten, dass sie nicht von der DataContext verfolgt werden, und dies kann Entwickler verwirren. Auf der anderen Seite, wenn der DataContext würde automatisch einfügen diese neu updates Entitäten, würde dies auch verwirrend sein. Die einzige verbleibende Option war, den Entwicklern mitzuteilen, dass dies keine so gute Idee ist, und das ist es, was Sie gesehen haben.

+0

Danke für die Erklärung, warum es nicht funktioniert. Könnten Sie jetzt veranschaulichen, wie es funktioniert? Welchen Code muss ich ändern? Vielen Dank. –

+1

Ändern Sie die Zeile 'result.AddRange (von o in friends2 select' nach' result.AddRange (from o in friends2.ToArray() select'.) – Steven

+1

Sie sollten dabei vorsichtig sein, da friends2 vor dem Erstellen des Objekts aufgelistet wird im ausgewählten Teil der LINQ-Abfrage. – Vedran

1

Es funktioniert, wenn Sie PrimaryKey nicht auf Spalten in Ihrer Friends-Klasse festgelegt haben. Auf diese Weise werden Änderungen für diese Klasse nicht mehr verfolgt, aber Ihr Code funktioniert.

Verwandte Themen