【问题标题】:Concatenating two ViewModels连接两个 ViewModel
【发布时间】:2012-11-16 17:58:02
【问题描述】:

我有两个要连接的相同 ViewModel 实例:

var queryNew = from a in ICDUnitOfWork.AlphaGroups.Find()
                           join e in ICDUnitOfWork.Alphas.Find()
                               on a.AlphaGroupID equals e.AlphaGroupID into g
                           join c in ICDUnitOfWork.Codes.Find()
                               on a.CodeID equals c.CodeID into co
                           select new HomeSearchViewModel
                                      {
                                          Alphas = g,
                                          AlphaGroups = a,
                                          AlphaGroupCode = co.FirstOrDefault(),
                                          SearchTerm = searchTerm,
                                          AlphasCodes = null
                                      };

var codequery = from a in ICDUnitOfWork.Alphas.Find()
                join c in ICDUnitOfWork.Codes.Find()
                on a.CodeID equals c.CodeID into g
                select new HomeSearchViewModel
                       {
                          AlphasCodes = g
                       };

var allResults = queryNew.Concat(codequery);

这给了我一个错误说明:

类型 'ICD.ViewModels.HomeSearchViewModel' 出现在两个 单个 LINQ 中结构不兼容的初始化 实体查询。一个类型可以在同一个地方的两个地方初始化 查询,但前提是在两个地方都设置了相同的属性并且 这些属性的设置顺序相同。

如何将这些结果合并在一起?

【问题讨论】:

  • 您是否尝试过异常提示的内容?没用吗?

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


【解决方案1】:

嗯,解决方案对我来说真的很愚蠢。我在尝试加入的表中添加了一个导航属性,现在一切正常。

哎呀!

【讨论】:

    【解决方案2】:

    Concat 在这里确实不是正确的做法,一个简单的for 循环就足够了。从您查询的外观来看,您可能会使用 AlphaGroupCode 作为映射的唯一标识符,例如

    var codequery = ...
                    select new HomeSearchViewModel
                    {
                        AlphaGroupCode = c.FirstOrDefault()
                        AlphasCodes = g
                    };
    
    foreach (var q in queryNew)
    {
        q.AlphaCodes = codequery.Where(x => x.AlphaGroupCode == q.AlphaGroupCode)
                                .FirstOrDefault()
                                .AlphaCodes;
    }
    

    【讨论】:

      【解决方案3】:

      您可以尝试事先评估查询,调用类似“ToList()”的方法:

      var allResults = queryNew.ToList().Concat(codequery.ToList());
      

      【讨论】:

        【解决方案4】:

        如果您不介意将其作为两个查询进行,那么调用 AsEnumerable() 将毫无问题地连接到本地内存中。

        var result = queryNew.AsEnumerable().Concat(codequery); 
        

        这里AsEnumerable() 仍然会推迟查询的执行(这是您的代码似乎建议的),但是如果您想立即执行,请按照 Arthur 的建议并调用缓存函数,例如ToList()ToArray()

        【讨论】:

          【解决方案5】:

          所有其他属性都必须填写 null

          var codequery = from a in ICDUnitOfWork.Alphas.Find()
                          join c in ICDUnitOfWork.Codes.Find()
                          on a.CodeID equals c.CodeID into g
                          select new HomeSearchViewModel
                                 {
                                    Alphas = null,
                                    AlphaGroups = null,
                                    AlphaGroupCode = null,
                                    SearchTerm = null,
                                    AlphasCodes = g
                                 };
          
          var allResults = queryNew.Concat(codequery);
          

          【讨论】:

            猜你喜欢
            • 2023-04-09
            • 2014-07-12
            • 1970-01-01
            • 1970-01-01
            • 2016-11-18
            • 2019-03-30
            • 1970-01-01
            • 2016-12-09
            • 1970-01-01
            相关资源
            最近更新 更多