如何使用LINQ选择多个表

时间:2014-02-10 15:34:42

标签: c# asp.net-mvc linq

如果我没有提供正确的信息,请原谅我,我是这个MVC事的新手。

我正在使用下面的LINQ语句,问题是图像URL 没有显示。有什么想法吗?提前致谢

控制器:

public ActionResult Index()
{
    var cars = from c in db.Cars
               from m in db.Makes from u in db.CarImages 
               where c.carID == m.makeID && u.CarID == c.carID && (u.thumbnail.Equals("true")) 
               select c;
    return View(cars.ToList());
}

查看:

@Html.DisplayFor(modelItem => item.CarImage.imageUrl)

更多信息: 我使用代码第一种方法。

车型:

public class Car
    {
        public int carID { get; set; }
        public int makeID {get; set;}
        public string registration { get; set; }
        public string color { get; set; }
        public Decimal price { get; set; }
        public string fuel { get; set; }
        public DateTime tax { get; set; }
        public DateTime mot { get; set; }
        public DateTime manufactureDate { get; set; }
        public string shortDescription { get; set; }
        public string longDescription { get; set; }

        public virtual Make Make { get; set; }
        public virtual CarModel CarModel { get; set; }
        public virtual CarImage CarImage { get; set; }

    }

CarImage模型

public class CarImage
    {
        public int CarImageID { get; set; }
        public int CarID { get; set; }
        public string imageUrl { get; set; }
        public string thumbnail { get; set; }
    }

制作模型

public class Make
    {
        public int makeID { get; set; }
        public string makeName { get; set; }
    }

的DbContext

public class CarStudioDBContext : DbContext
    {

            public DbSet<Car> Cars { get; set; }
            public DbSet<Make> Makes { get; set; }
            public DbSet<CarImage> CarImages { get; set; }
            public DbSet<CarModel> CarModels { get; set; }

    }

感谢帮助人员

2 个答案:

答案 0 :(得分:1)

不使用Html.DisplayFor()助手,只需输出属性值

即可
@item.CarImage.imageUrl

或者,如果您希望它是实际图像,您可以执行以下操作

<img src="@item.CarImage.imageUrl" alt="Car Pic"/>

其他信息:

我认为你错过了从CarImages到汽车的联系。我看到你有你的外键(carId),但你还需要一个实体对象将它绑回汽车。

public class CarImage
    {
        public int CarImageID { get; set; }
        public int CarID { get; set; }
        public string imageUrl { get; set; }
        public string thumbnail { get; set; }

        public virtual Car Car { get; set; }
    }

基于examples here。你需要为Make做同样的事情,但是以不同的方式。最后,一旦所有内容捆绑在一起,我认为你不需要复杂的linq查询。

答案 1 :(得分:1)

您可能想要检查LINQ是否返回正确的数据,因为我可以看到您正在使用carID加入makeID,这看起来不正确。

实际上你不需要在linq中加入表,只需要使用Include方法来包含属性:

var cars = from c in db.Cars.Include("Make").Include("CarImage")
           select c;