【问题标题】:Combine LINQ result from multiple DbContext into single Object将来自多个 DbContext 的 LINQ 结果合并到单个对象中
【发布时间】:2017-04-14 15:39:09
【问题描述】:

我有 2 个 LINQ,每个都有不同的 DbContext。我想将两者的结果添加到单个对象引用中。即 peopleEntity 和 WebSyncDetailObject(参考 linq select new{..})

类对象

public class WebSyncDetailEntity
{
    public Web_SyncMatchesEntity WebSyncMatch { get; set; }

    public Web_LookupsEntity WebLookups { get; set; }

    public List<PeopleEntity> People { get; set; }
}

LINQ 处理类

 private List<WebSyncDetailEntity> ProcessGetWebSyncDetail()
    {
        List<WebSyncDetailEntity> WebSyncDetailObject = null;

        using (var _uow = new UCAS_WebSync_AdminTool_UOF())
        {
            try
            {
                List<PeopleEntity> peopleEntity = null ;

                int? personCode = _uow.Web_SyncMatchesRepository.GetAll().Where(x => x.SUBMISSION_ID == "28105").Select(y => y.PERSON_CODE).FirstOrDefault() ;

                using(var _fes_uow = new FES_UOF())
                {
                    peopleEntity = _fes_uow.PeopleRepository.GetAll().Where(x => x.PERSON_CODE == personCode).ToList();
                    var t = "d";
                }

               WebSyncDetailObject = (from esm in _uow.Web_SyncMatchesRepository.GetAll()
                                      join lup in (_uow.Web_LookupsRepository.GetAll().Where(a => a.RV_DOMAIN == "match_method")) on esm.MATCH_METHOD equals lup.LOOKUP_KEY
                                      where esm.SUBMISSION_ID == "28105"
                                      select new WebSyncDetailEntity {WebSyncMatch = esm, WebLookups = lup, People = peopleEntity }).ToList();

                //throw error here!
            }
            catch(Exception exp)
            {
                Debug.WriteLine(exp.ToString());
            }
        }

            return null;
    }

我想要 WebSyncDetailEntity 对象中的最终结果

第二个错误

【问题讨论】:

    标签: c# linq dbcontext


    【解决方案1】:

    我认为您在这里遇到异常的原因是它试图在发送到数据库的查询中包含peopleEntity。这是行不通的,因为查询中不支持复杂的数据类型。

    一个简单的解决方法是在查询中首次创建 WebSyncDetailObject 时将 People 字段保留为空,然后在下一行将其设置为 peopleEntity

    【讨论】:

    • 我已经完成了第一部分,但是我如何在下一行将其设置为 peopleEntity??
    • 嗯,对于WebSyncDetailObject 中的每个WebSyncDetailEntity,它都将是相同的,因此您可以执行一个foreach 循环并为每个循环设置属性。 Kosala 的回答似乎是一种更简洁的方法!
    • 另外,为什么你想要一个WebSyncDetailEntity 对象列表,它们都指向同一个People 对象?拥有一个具有WebSyncDetailEntity 列表的对象以及对相关People 对象的单一引用会更好吗?
    • 理想情况下会很棒!
    【解决方案2】:

    我认为你可以这样做。

    var resultsFromDb = (from esm in _uow.Web_SyncMatchesRepository.GetAll()
                                          join lup in (_uow.Web_LookupsRepository.GetAll().Where(a => a.RV_DOMAIN == "match_method")) on esm.MATCH_METHOD equals lup.LOOKUP_KEY
                                          where esm.SUBMISSION_ID == "28105" select new {esm = esm, lup = lup, peopleEntity = peopleEntity}).ToList(); // Here we break the linq to sql query
    
    // Then run a select query on the above collection to get what we want.  
    WebSyncDetailObject  = resultsFromDb.Select(r => new WebSyncDetailEntity {WebSyncMatch = r.esm, WebLookups = r.lup, People = r.peopleEntity }).ToList();
    

    【讨论】:

    • var resultsFromDb 说 A Query Body 必须以 select 子句或 group 子句结尾...抛出错误
    • 我错过了那部分。固定的。立即尝试。
    • 抛出错误,我已经尝试过了,在 ToList() 错误时使用 peopleEntity = peopleEntity 在第一个 LINQ 查询冲突中使用:在此上下文中仅支持原始类型或枚举类型
    • 哪个报错了?第一次查询还是第二次查询?
    • 检查第二个错误下的错误截图,我已经更新了我的问题
    【解决方案3】:

    我找到了答案;遍历列表并将对象添加到匹配条件的现有列表对象

     public class WebSyncDetailEntity
    {
        public Web_SyncMatchesEntity WebSyncMatch { get; set; }
    
        public Web_LookupsEntity WebLookups { get; set; }
    
        public PeopleEntity People { get; set; }
    }
    

    ...

     private List<WebSyncDetailEntity> ProcessGetWebSyncDetail()
        {
            List<WebSyncDetailEntity> WebSyncDetailObject = null;
    
            using (var _uow = new UCAS_WebSync_AdminTool_UOF())
            {
                try
                {
                    List<PeopleEntity> peopleEntity = null ;
    
                    int? personCode = _uow.Web_SyncMatchesRepository.GetAll().Where(x => x.SUBMISSION_ID == "28105").Select(y => y.PERSON_CODE).FirstOrDefault() ;
    
                    using(var _fes_uow = new FES_UOF())
                    {
                        peopleEntity = _fes_uow.PeopleRepository.GetAll().Where(x => x.PERSON_CODE == personCode).ToList();
                    }
    
                    WebSyncDetailObject = (from esm in _uow.Web_SyncMatchesRepository.GetAll()
                                             join lup in (_uow.Web_LookupsRepository.GetAll().Where(a => a.RV_DOMAIN == "match_method")) on esm.MATCH_METHOD equals lup.LOOKUP_KEY
                                             where esm.SUBMISSION_ID == "28105"
                                             select new WebSyncDetailEntity { WebSyncMatch = esm, WebLookups = lup }).ToList();
    
                      int index = 0;
                      foreach(var item in WebSyncDetailObject)
                      {
                          WebSyncDetailObject[index].People = peopleEntity.Where(x => x.PERSON_CODE == WebSyncDetailObject[index].WebSyncMatch.PERSON_CODE).FirstOrDefault();
                          index++;
                      }
                }
                catch(Exception exp)
                {
                    Debug.WriteLine(exp.ToString());
                }
            }
                return null;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多