Das Grundproblem ...LinqToSql und das Mitglied Zugang nicht legal auf Typen Ausnahme
Ich habe eine Methode, die den folgenden Code ausführt:
IList<Gig> gigs = GetGigs().WithArtist(artistId).ToList();
Die GetGigs() -Methode wird Gigs aus meiner Datenbank über LinqToSql ...
Also, wenn GetGigs() WithArtist (artistId) .ToList() ausgeführt ich die folgende Ausnahme erhalten.
Member access 'ListenTo.Shared.DO.Artist Artist' of 'ListenTo.Shared.DO.Act' not legal on type 'System.Collections.Generic.List`1[ListenTo.Shared.DO.Act]
Hinweis
, dass die Erweiterungsfunktion „WithArtist“ sieht wie folgt aus:
public static IQueryable<Gig> WithArtist(this IQueryable<Gig> qry, Guid artistId)
{
return from gig in qry
where gig.Acts.Any(act => (null != act.Artist) && (act.Artist.ID == artistId))
orderby gig.StartDate
select gig;
}
Wenn ich ersetzen die GetGigs() -Methode mit einem Verfahren, das eine Sammlung von Gigs in Code (und nicht von der DB über LinqToSQL Konstrukten) Ich bekomme NICHT die Ausnahme.
So bin ich ziemlich sicher, dass das Problem mit meinem LinqToSQl-Code und nicht die Objektstruktur ist.
Allerdings habe ich keine Ahnung, warum die LinqToSQl-Version nicht funktioniert, also habe ich den gesamten zugehörigen Code unten enthalten. Jede Hilfe wäre sehr dankbar erhalten !!
Der LinqToSQL Code ....
public IQueryable<ListenTo.Shared.DO.Gig> GetGigs()
{
return from g in DBContext.Gigs
let acts = GetActs(g.ID)
join venue in DBContext.Venues on g.VenueID equals venue.ID
select new ListenTo.Shared.DO.Gig
{
ID = g.ID,
Name = g.Name,
Acts = new List<ListenTo.Shared.DO.Act>(acts),
Description = g.Description,
StartDate = g.Date,
EndDate = g.EndDate,
IsDeleted = g.IsDeleted,
Created = g.Created,
TicketPrice = g.TicketPrice,
Venue = new ListenTo.Shared.DO.Venue {
ID = venue.ID,
Name = venue.Name,
Address = venue.Address,
Telephone = venue.Telephone,
URL = venue.Website
}
};
}
IQueryable<ListenTo.Shared.DO.Act> GetActs()
{
return from a in DBContext.Acts
join artist in DBContext.Artists on a.ArtistID equals artist.ID into art
from artist in art.DefaultIfEmpty()
select new ListenTo.Shared.DO.Act
{
ID = a.ID,
Name = a.Name,
Artist = artist == null ? null : new Shared.DO.Artist
{
ID = artist.ID,
Name = artist.Name
},
GigId = a.GigID
};
}
IQueryable<ListenTo.Shared.DO.Act> GetActs(Guid gigId)
{
return GetActs().WithGigID(gigId);
}
ich den Code für das Gesetz, Künstler und Gig aufgenommen haben Objekte unter:
public class Gig : BaseDO
{
#region Accessors
public Venue Venue
{
get;
set;
}
public System.Nullable<DateTime> EndDate
{
get;
set;
}
public DateTime StartDate
{
get;
set;
}
public string Name
{
get;
set;
}
public string Description
{
get;
set;
}
public string TicketPrice
{
get;
set;
}
/// <summary>
/// The Act object does not exist outside the context of the Gig, therefore,
/// the full act object is loaded here.
/// </summary>
public IList<Act> Acts
{
get;
set;
}
#endregion
}
public class Act : BaseDO
{
public Guid GigId { get; set; }
public string Name { get; set; }
public Artist Artist { get; set; }
}
public class Artist : BaseDO
{
public string Name { get; set; }
public string Profile { get; set; }
public DateTime Formed { get; set; }
public Style Style { get; set; }
public Town Town { get; set; }
public string OfficalWebsiteURL { get; set; }
public string ProfileAddress { get; set; }
public string Email { get; set; }
public ImageMetaData ProfileImage { get; set; }
}
public class BaseDO: IDO
{
#region Properties
private Guid _id;
#endregion
#region IDO Members
public Guid ID
{
get
{
return this._id;
}
set
{
this._id = value;
}
}
}
}
Ich renne in diesen gleichen Fehler und in meinem Fall scheint es mit der Verwendung einer korrelierten Unterabfrage innerhalb meiner WHERE-Klausel verwandt zu sein. Wenn ich irgendwelche Informationen finde, werde ich Ihnen ein Update geben. – jpierson