【问题标题】:MVC 4. and Entity Framework Table JoinMVC 4. 和实体框架表连接
【发布时间】:2013-03-14 18:02:20
【问题描述】:

这个项目快把我逼疯了 ;-) 我正在尝试做一个连接两个表的简单查询

我有以下几点:

存储库类方法

 public IQueryable<ADPerson> FindAll(string UserId)
    {
        return (from p in db.ADPerson
                select p); 


    }

在我的控制器中:

  var ADPersonList = from o in ADPersonDB.FindAll(GetUserId())
                    join c in MSDNTypeDB.FindAll(GetUserId()) on o.MsdnTypeId equals c.MsdnTypeId
                    select new ADPerson()
                    {

                        AdPersonId = o.AdPersonId,
                        SamAccountName = o.SamAccountName,
                        Description = o.Description,
                        DisplayName = o.DisplayName,
                        UserPrincipalName = o.UserPrincipalName,
                        Enabled = o.Enabled,
                        LastUpdated = o.LastUpdated,
                        OnlineAssetTag = o.OnlineAssetTag,
                        MsdnTypeId = o.MsdnTypeId,
                        MsdnSubscription = c.MsdnTypeDescription,


                    };

我不断收到错误:

{"The specified LINQ expression contains references to queries that are associated with different contexts."}

我也尝试添加到存储库类:

存储库类方法

 public IQueryable<ADPerson> FindAll(string UserId)
    {
        //return (from p in db.ADPerson
        //        select p); 

        var query = from o in db.ADPerson
                    join c in db.MsdnTypes on o.MsdnTypeId equals c.MsdnTypeId
                    select new ADPerson()
                    {

                        AdPersonId = o.AdPersonId,
                        SamAccountName = o.SamAccountName,
                        Description = o.Description,
                        DisplayName = o.DisplayName,
                        UserPrincipalName = o.UserPrincipalName,
                        Enabled = o.Enabled,
                        LastUpdated = o.LastUpdated,
                        OnlineAssetTag = o.OnlineAssetTag,
                        MsdnTypeId = o.MsdnTypeId,

                        MsdnSubscription = c.MsdnTypeDescription,


                    };

        return query;

    }

在实体框架中做两个表之间的简单连接并填充变量真的很难吗

谢谢

【问题讨论】:

  • 使用第二种方法是不是同样的错误?
  • 优点:没有第二个返回的错误是:无法在LINQ to Entities查询中构造实体或复杂类型'project.Models.ADPerson'。
  • RE:第二个错误。那是因为你不能 project 到一个映射的实体上。您可以将查询投影到匿名对象,然后将其映射到 ADPerson 实体
  • 或者,您可以选择创建一个未映射的 DTO,投影到 那个,然后映射回 ADPerson 实体。
  • 哦,所以返回 List 而不是 IQuerable?抱歉有点困惑,因为这两个表都映射到存储库类中。确定如何创建未映射的 DTO 并再次映射回来

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


【解决方案1】:

投影到匿名对象

var query = from o in db.ADPerson
   join c in db.MsdnTypes on o.MsdnTypeId equals c.MsdnTypeId
   select new 
   {
     AdPersonId        = o.AdPersonId,
     SamAccountName    = o.SamAccountName,
     Description       = o.Description,
     DisplayName       = o.DisplayName,
     UserPrincipalName = o.UserPrincipalName,
     Enabled           = o.Enabled,
     LastUpdated       = o.LastUpdated,
     OnlineAssetTag    = o.OnlineAssetTag,
     MsdnTypeId        = o.MsdnTypeId,
     MsdnSubscription  = c.MsdnTypeDescription,
  };

然后映射回你的实体

foreach (var item in query)
{
  var adPerson = new ADPerson
  {
    AdPersonId         = item.AdPersonId,
    SamAccountName     = item.SamAccountName,
    Description        = item.Description,
    DisplayName        = item.DisplayName,
    UserPrincipalName  = item.UserPrincipalName,
    Enabled            = item.Enabled,
    LastUpdated        = item.LastUpdated,
    OnlineAssetTag     = item.OnlineAssetTag,
    MsdnTypeId         = item.MsdnTypeId,
    MsdnSubscription   = item.MsdnTypeDescription,
  {
}

【讨论】:

  • 第一个 var 查询失败,是否应该选择新的?
  • @DavidCostelloe 是的,对不起。编辑答案
  • 在显示字段时出现错误“列名 'MsdnSubscription 无效”
  • 我应该返回查询,但它说我不能因为是匿名的。
  • 看起来我需要将匿名转换为 Iquerable 关于如何做到这一点的任何想法。在实体框架中加入表格似乎很麻烦,必须有更简单的方法吗?
【解决方案2】:
   public IQueryable<ADPerson> FindAll(string UserId)
    {
       // return (from p in db.ADPerson
       //        select p);
        List<ADPerson> lst = new List<ADPerson>();
        var query = from o in db.ADPerson
                    join c in db.MsdnTypes on o.MsdnTypeId equals c.MsdnTypeId
                    select new
                         {

                             AdPersonId = o.AdPersonId,
                             SamAccountName = o.SamAccountName,
                             Description = o.Description,
                             DisplayName = o.DisplayName,
                             UserPrincipalName = o.UserPrincipalName,
                             Enabled = o.Enabled,
                             LastUpdated = o.LastUpdated,
                             OnlineAssetTag = o.OnlineAssetTag,
                             MsdnTypeId = o.MsdnTypeId,
                             MsdnSubscription = c.MsdnTypeDescription

                         };
        foreach (var item in query)
        {
            var adPerson = new ADPerson()
              {
                  AdPersonId = item.AdPersonId,
                  SamAccountName = item.SamAccountName,
                  Description = item.Description,
                  DisplayName = item.DisplayName,
                  UserPrincipalName = item.UserPrincipalName,
                  Enabled = item.Enabled,
                  LastUpdated = item.LastUpdated,
                  OnlineAssetTag = item.OnlineAssetTag,
                  MsdnTypeId = item.MsdnTypeId,
                  MsdnSubscription = item.MsdnSubscription
              };
            lst.Add(adPerson);

        }

        return lst.AsQueryable();



    }

【讨论】:

  • 它可能是你在“MsdnSubscription = c.MsdnTypeDescription”处有一个尾随逗号,第二个也是
  • 谢谢发现是大括号 { 和 };快到了:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
相关资源
最近更新 更多