使用LINQ从两个实体读取相关数据

时间:2012-11-19 06:47:09

标签: c# asp.net-mvc-3 entity-framework-4 linq-to-entities

我有一对多的用户与证书的关系。在我看来,我能够看到来自用户的证书和相关数据的所有数据。但是这个视图让我重复了UserID并且无效。请先查看此问题here

在此视图中,我使用了此查询

var certUser = var cert = db.Certificates.Include(c => c.Users);
var AllcertUser = from s in certUser select s;
return View(AllcertUser.ToList());

由于UserID与此LINQ代码不同于此控制器:

 var Allusers = from s in db.Users
                       select s;
 return View(Allusers.ToList());

我从上面的代码中获得了不同的用户。当我尝试从证书类中包含时,这是我无法使其工作的地方。我需要包含证书,以便我可以从该实体获得相关的值。我希望我能说清楚。

这是我需要的一部分。单击“详细信息”时,必须传递UserID并显示其详细信息。目前我有硬编码ID 23.如何将用户ID传递给详细信息视图,以便获取证书详细信息。

 public ActionResult Details(int id)
    {
        cpdEntities db = new cpdEntities();

        var UserCerts = db.Certificates.Where(x => x.UserID == 23).ToList();
        return View(UserCerts);
    }

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望连接表并返回按用户分组的所有证书:

var query = from u in db.Users
            join c in db.Certificates on u.UserID equals c.UserID into g
            select new { User = u, Certificates = g };

或者您可以预加载证书(如果禁用延迟加载):

var query = db.Users.Include(u => u.Certificates);

答案 1 :(得分:1)

您看到多个UserIds的原因是您正在查询证书实体,正如您所说,它与用户有m:1的关系。如果您的视图是主子类型表单,并且您希望每个用户只能看到一行,那么请执行相反的查询:

var users = db.Users.Include(u => u.Certificates);

在您的视图中,您可以根据需要迭代每个用户的证书集合。例如,根据视图的设计,您可能只想显示一个所选用户的证书。