2011-05-12 80 views
1

一天的美好時光!Linq to Entity |通過表加入模型

我在控制器查詢MVC項目:

var getPhotos = (from m in db.photos 
    join n in db.comments on m.id equals n.photoid 
    where n.ownerName == User.Identity.Name 
    orderby n.id descending 
    select new { 
     m.imgcrop, m.id, 
     n.commenterName, n.comment 
    }).Take(10); 

如何通過這個查詢,查看模型,該模型來查看。

花費整晚找到的例子,但不能。感謝幫助!

修訂 全部模型類

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace photostorage.Models 
{ 
    public class GlobalModel 
    { 
     public class PhotoViewModel 
     { 
      public photos Photos { get; set; } 
      public profiles Profile { get; set; } 
      public IQueryable<comments> Comments { get; set; } 
      public IQueryable<photos> NextPrev { get; set; } 
     } 

     public class UserPhotoList 
     { 
      public IQueryable<photos> Photos { get; set; } 
      public profiles Profile { get; set; } 
     } 

     public class UserProfileView 
     { 
      public IQueryable<photos> Photos { get; set; } 
      public profiles Profile { get; set; } 
     } 

     public class GetLastComments 
     { 
      public IQueryable<photos> uPhoto { get; set; } 
      public IQueryable<comments> uComments { get; set; } 
     } 
    } 
} 

控制器:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using photostorage.Models; 

namespace photostorage.Controllers 
{ 
    public class HomeController : Controller 
    { 
     private photostorageEntities db = new photostorageEntities(); 

     public ActionResult Index() 
     { 
      if(Request.IsAuthenticated) { 
       GlobalModel.GetLastComments model = new GlobalModel.GetLastComments(); 
       var getPhotos = (from m in db.photos 
            join n in db.comments on m.id equals n.photoid 
            where n.ownerName == User.Identity.Name 
            select new { 
             m.imgcrop, m.id, 
             n.commenterName, n.comment 
            }).Take(10); 
       return View("Index_Auth", model); 
      }else{ 

       ViewBag.Message = "Welcome to ASP.NET MVC!"; 
       return View("Index"); 
      } 
     } 

     public ActionResult About() 
     { 
      return View(); 
     } 
    } 
} 
+0

您如何期待我們回答此問題而不顯示您的視圖模型的外觀或至少解釋您的視圖需要展示什麼以及這與您使用EF的模型有何不同?至於傳遞視圖模型到視圖,我認爲這應該是非常簡單的:'返回視圖(someInstanceOfAViewModel);'。 – 2011-05-12 21:45:13

+0

如何將此查詢轉換爲返回View(someInstanceOfAViewModel);如果現在我像你寫的一樣,我有一個錯誤。 PIf對你來說不難,只是寫了一個模型和控制器的小例子。 – 2011-05-12 21:50:02

+0

我認爲你編輯了這個模型和控制器,但它仍然看起來不完整。當然,Craig M在下面通過創建一個新模型回答了這個問題,但是上面的代碼引用了m.imgcrop,m.id,n.commenterName和n.comment,它們不是上述任何模型的一部分,所以很難知道你從哪裏提取數據(表格,視圖等)。 db.Photos和db.Comments模型丟失。上面的這些模型並沒有告訴我你想做什麼。 – vapcguy 2014-08-09 00:41:44

回答

3

在這種情況下,你就可以說只有通過你的看法,而不是由所使用的「視圖模式」其餘的應用程序。像下面這樣:

public class CommentsViewModel 
{ 
    public int MessageId { get; set; } 
    public string ImageCrop { get; set; } 
    public string CommenterName { get; set; } 
    public string Comment { get; set; } 
} 

然後更改您的查詢,像這樣:

var getPhotos = (from m in db.photos 
    join n in db.comments on m.id equals n.photoid 
    where n.ownerName == User.Identity.Name 
    orderby n.id descending 
    select new CommentsViewModel { 
     ImageCrop = m.imgcrop, 
     MessageId = m.id, 
     CommenterName = n.commenterName, 
     Comment = n.comment 
    }).Take(10).ToList(); 

讓您的視圖強類型的新類和數據傳遞給它,像這樣:

View("name_of_your_view", getPhotos); 
+0

非常感謝,它的工作原理! :) – 2011-05-12 22:55:16

+0

不客氣! :) – 2011-05-13 16:11:11

0

如果你想這樣做,就像你有:

var getPhotos = (from m in db.photos 
           join n in db.comments on m.id equals n.photoid 
           where n.ownerName == User.Identity.Name 
           select new { 
            m.imgcrop, m.id, 
            n.commenterName, n.comment 
           }).Take(10); 

其實你可以有這個,而無需創建一個新的「CommentsViewModel」,只是用什麼應該是現有的表和模式:

var getPhotos = (from m in db.Photos 
           join n in db.Comments on m.Id equals n.PhotoId 
           where n.OwnerName == User.Identity.Name 
           select new { 
            ImageCrop = m.ImageCrop, 
            Id = m.Id, 
            CommenterName = n.CommenterName, 
            Comment = n.Comment 
           }).Take(10); 

該機型將像這些例子,如果你有一個外鍵關係在Photo.Id到Comments.PhotoId:

public class Photos 
{ 
    public int Id { get; set; } 
    public string ImageCrop { get; set; } 

    [ForeignKey("PhotoId")] 
    public virtual Comments Comment { get; set; } 
} 
public class Comments 
{ 
    public int Id { get; set; } 
    public int PhotoId { get; set; } 
    public string CommenterName { get; set; } 
    public string OwnerName { get; set; } 
    public string Comment { get; set; } 
} 

剛一說明:你在你的問題中顯示的車型有沒有這些列的,但你正在建立對他們的查詢。最好記得在尋求幫助時給出一個完整的圖片。