将ViewData与连接查询一起使用

时间:2011-04-01 15:49:53

标签: asp.net-mvc linq-to-sql ado.net viewdata

更新

我现在让它工作到一定程度上填充了视图,但我的查询错误,因此没有检索到数据。

我的ViewModel

public class ViewProductions
{

    public string Venuename { get; set; }
    public string Showname { get; set; }
    public DateTime ProductionYear { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }


}  

查询

var query =  
                     from f in _db.Production
                     join g in _db.Run on f.show equals g.venue
                     select new ViewProductions {
                            Venuename = g.venue,
                            Showname = f.show,

                            StartDate = g.startDate,
                            EndDate = g.endDate


                     };

        return View(query);

我有SQL格式的查询

    SELECT Production.show, Run.venue, Run.startDate, Run.endDate,  Production.director, Production.designer
FROM  Production INNER JOIN
 Run ON Production.show = Run.show

有人可以帮我转换为linq吗?

再次感谢

1 个答案:

答案 0 :(得分:1)

这是一个好的开始。记住这个想法是ViewModel将包含视图所需的所有数据。尽可能大或小。

如果您要显示Show列表,则可能需要将其更改为:

 public List<Show> {get; private set;}

如果在给定对象中,您只使用一个属性。不要担心创建ViewData属性而不是使用整个对象。举个例子:

public class Venue
{
    public string Name;
    public string State;
    public string City;
    public int Capacity;
    ...
}

让我们说这个给定的ViewModel你只需要Venue的名字。无需添加整个Venue,只需添加VenuName属性即可。

blog有一个很好的解释。

修改

Here是使用System.Data.Linq.SqlClient.SqlMethods专门用于DATEDIFF的一些不错的示例。你可以这样做:

 where SqlMethods.DateDiffMonth(Book.EntryDate, DateTime.Now) <= 3 order by dates.startDate

编辑2

尝试这样的事情:

一些指针,注意 ViewModelProduction(),你必须把()表示你正在创建新对象。 ToList()是转换LINQ返回的IEnumerable。同样在这种情况下,我在startDate上使用 orderby 。查看一些LINQ examples。这个非常有用的工具:LinqPad

var query = (from p in db.Production
            join r in _db.Run on p.show equals r.show
            orderby r.startDate
            select new ViewModelProduction()
            {
                show = p.show,
                venue = r.venue,
                startDate = r.startDate,
                endDate = r.endDate,
                director = p.director,
                designer = p.director
            }).ToList();