连接两个ViewModel

时间:2012-11-16 17:58:03

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

我想要连接同一个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中的结构不兼容的初始化   实体查询。一个类型可以在同一个地方初始化   查询,但仅当在两个地方都设置了相同的属性时   这些属性的设置顺序相同。

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

5 个答案:

答案 0 :(得分:1)

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

哎呦!

答案 1 :(得分:0)

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;
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果您不介意将其作为两个查询,那么调用AsEnumerable()将在本地内存中连接而没有任何问题。

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

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

答案 4 :(得分:0)

您必须填写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);