使用Linq to SQL选择多个表

时间:2010-10-04 14:40:12

标签: asp.net-mvc linq-to-sql telerik

我正在尝试使用Linq To Sql将来自两个不同表的列绑定到gridview

这是绑定:

var q =(来自mail.tblmails中的o     在o.staffId上的mail.tblstaffs中加入c等于c.id
    选择新的{o,c});
    return view(q);

这是我在我的视图中调用绑定的地方。

.Columns(columns =>        {

       columns.Bound(o => o.dateAdded).Format("{0:MM/dd/yyyy}").Width(80);
       columns.Bound(o => o.companyId);
       //columns.Bound(c => c.staffId);
       columns.Bound(o => o.subject);
       columns.Bound(o => o.dateArchived);

   })

我收到错误

异常详细信息:System.InvalidOperationException:传递到字典中的模型项的类型为'System.Data.Linq.DataQuery 1[<>f__AnonymousType0 6 [System.Nullable 1[System.DateTime],System.Nullable 1 [System.Int32], System.String,System.Nullable 1[System.DateTime],System.String,System.Int32]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable 1 [ffs.Models.tblmail]”。

我觉得这个问题可能与行

有关

&LT; %Page Title =“”Language =“C#”MasterPageFile =“〜/ Views / Shared / Site.Master”Inherits =“System.Web.Mvc.ViewPage&gt;”%&gt;

但我不知道该怎么做才能修复它。

我正在使用telerik网格扩展。

任何帮助都会很棒,谢谢。

2 个答案:

答案 0 :(得分:3)

您现在正在做的事情(也做错了)是将查询数据直接发送到视图。这被认为是不好的做法。虽然可以访问生成的匿名类型,但此方法将导致在视图期间而不是在控制器中进行数据访问。

我建议您创建一个模型(类)来表示数据,并使用以下命令将这些实体(您的模型)的列表返回给视图:

<% Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<List<yourCreatedModelClass>>"%>

观察您告诉视图的部分,您正在处理一个对象列表,而不仅仅是一个干净的视图。

讨论了一些相关问题和解决方案here

答案 1 :(得分:2)

我认为问题(查看您的错误消息)在于您在视图期待IEnumerable<tblmail>时尝试传递匿名类型。

您要做的是创建一个数据结构,如:

public class Model
{
   public tblmails Mails { get; set; }
   public tblstaff Staff { get; set; }
}

然后在你的linq查询中,你将o放入Model.Mails,然后将c放入Model.Staff。然后,将IEnumerable<Model>结果传递到您的视图中,并将您的视图挂钩,以便期望IEnumerable<Model>作为模型。