使用多个连接的linq查询时如何解决“指定的强制转换无效”错误?

时间:2012-10-16 16:47:12

标签: asp.net-mvc linq

我遇到了一个问题,我正在尝试在我的存储库中构建一个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中尝试查询时,它工作正常并且返回我想要的数据,所以当我尝试将对象传回时,它似乎是错误的。我已经尝试了一些这方面的事情,每次我似乎都得到同样的错误;我很难找到导致它的原因。提前感谢您提供的任何帮助。

1 个答案:

答案 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()的行。