Vấn đề cơ bản ...linqtosql và thành viên truy cập không hợp pháp vào loại ngoại lệ
Tôi có một phương pháp mà thực thi đoạn mã sau:
IList<Gig> gigs = GetGigs().WithArtist(artistId).ToList();
Các GetGigs() phương pháp được hợp đồng biểu diễn từ cơ sở dữ liệu của tôi qua LinqToSql ...
Vì vậy, khi GetGigs() WithArtist (artistId) ToList() được thực hiện tôi nhận được ngoại lệ sau đây:.
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]
Lưu ý rằng các chức năng mở rộng "WithArtist" trông như thế này:
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;
}
Nếu tôi thay thế GetGigs phương pháp() với một phương pháp mà xây dựng một tập hợp các hợp đồng biểu diễn trong đang (chứ không phải từ DB qua LinqToSQL) Tôi KHÔNG nhận được ngoại lệ.
Vì vậy, tôi khá chắc chắn vấn đề là với mã LinqToSQl của tôi chứ không phải là cấu trúc đối tượng.
Tuy nhiên, tôi KHÔNG có IDEA lý do tại sao phiên bản LinqToSQl không hoạt động, vì vậy tôi đã bao gồm tất cả mã được liên kết bên dưới. Bất kỳ sự trợ giúp nào cũng sẽ được VERY biết ơn!
Mã LinqToSQL ....
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);
}
Tôi đã bao gồm mã cho Đạo luật, Artist và Gig các đối tượng dưới đây:
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;
}
}
}
}
Tôi đang chạy vào cùng một lỗi này và trong trường hợp của tôi, dường như có liên quan đến việc sử dụng truy vấn con tương quan trong mệnh đề WHERE của tôi. Nếu tôi tìm thấy bất kỳ thông tin nào tôi sẽ cung cấp cho bạn một bản cập nhật. – jpierson