我遇到了一个问题,我正在尝试在我的存储库中构建一个Linq查询,该查询包含来自数据库中不同表的多个连接,然后将其作为对象返回以供我的控制器显示。我得到的错误是:“指定的演员表无效。”
问题部分似乎是当我尝试从查询中传递对象时,我不确定如何解决这个问题。 (我仍然相对较新的Web开发并尝试学习基础知识)。
以下是我的存储库中的代码:
public ListingModel GetListing(int listingId)
{
var query = from listing in listingsTable
where listing.ListingID == listingId
join feature
in featuresTable on listing.ListingID equals feature.ListingID into features
from f in features.DefaultIfEmpty()
join avail
in availabilityTable on listing.ListingID equals avail.ListingID into availability
from a in availability.DefaultIfEmpty()
join image
in imageTable on listing.ListingID equals image.ListingID into images
from i in images.DefaultIfEmpty()
select new ListingModel
{
Listing = listing,
Features = features,
Availability = availability,
Images = images
};
return query.FirstOrDefault();
}
如果需要,这里是ListingModel类:
public class ListingModel
{
public Listing Listing { get; set; }
public IEnumerable<Feature> Features { get; set; }
public IEnumerable<Availability> Availability { get; set; }
public IEnumerable<Image> Images { get; set; }
}
当我在LinqPad中尝试查询时,它工作正常并且返回我想要的数据,所以当我尝试将对象传回时,它似乎是错误的。我已经尝试了一些这方面的事情,每次我似乎都得到同样的错误;我很难找到导致它的原因。提前感谢您提供的任何帮助。
答案 0 :(得分:0)
尝试在查询中选择一个匿名对象,然后使用它在内存中实例化ListingModel
。方法的结尾如下所示:
select new
{
Listing = listing,
Features = features,
Availability = availability,
Images = images
};
return query.AsEnumerable()
.Select(x => new ListingModel
{
Listing = x.Listing,
Features = x.Features,
Availability = x.Availability,
Images = x.Images
})
.FirstOrDefault();
但是,您不能只利用外键关系并让LINQ to SQL为您加入关联表吗?另外,为了避免创建重复的ListingModel,您应该删除包含DefaultIfEmpty()
的行。