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