3

我有两个要连接的相同 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 to Entities 查询中的两个结构不兼容的初始化中。可以在同一个查询中的两个位置初始化一个类型,但前提是在两个位置都设置了相同的属性并且这些属性以相同的顺序设置。

我怎样才能将这些结果结合在一起?

4

5 回答 5

1

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

哎呀!

于 2012-11-16T23:17:15.427 回答
0

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

var allResults = queryNew.ToList().Concat(codequery.ToList());
于 2012-11-16T19:09:41.113 回答
0

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

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

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

于 2012-11-16T19:14:58.017 回答
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);
于 2014-11-12T14:34:27.413 回答
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;
}
于 2012-11-16T18:13:03.497 回答