我正在开发一个asp mvc应用程序。 我正在整理一个查询,其中包含来自2个不同表的2个名称列表,然后将它们放在一起。查询是在一个方法中,所以我可以轻松地调用它。我遇到的问题是我得到一个错误,无论我是尝试Union还是Intersect。错误是:
“Model.PersonAttributes不包含Union(或Intersect)的定义和最佳重载,等等......”
这是我的代码:
public List<SearchAndMergeViewModel> SearchForMerge(string FName, string LName, string DOB)
{
var query = from p in _Elig_DB.PersonAttributes.ToList()
where p.getDateOfBirth == DOB &&
(p.FirstName.Contains(FName) || p.FirstName.StartsWith(FName) &&
p.LastName.Contains(LName) || p.LastName.StartsWith(LName))
select p;
var queryb = from a in _Elig_DB.PersonAlias.ToList()
join e in _Elig_DB.PersonAttributes.ToList() on a.PersonID equals e.PersonID
where a.FirstName == FName && a.LastName == LName
select new SearchAndMergeViewModel
{
FirstN = a.FirstName,
LastN = a.LastName,
DOB = e.DOB
};
var results = query.Intersect(queryb);
return results.ToList();
}
以上错误连接到“var results = query.Intersect(queryb);”这一行。
我也收到错误,“无法从使用中推断出方法Enumerable.ToList的类型参数。”
有什么想法吗?
答案 0 :(得分:0)
尝试一下:
public List<SearchAndMergeViewModel> SearchForMerge
(string firstName, string lastName, string dateOfBirth)
{
var queryA =
from a in _Elig_DB.PersonAttributes.ToList()
where
a.getDateOfBirth == dateOfBirth
&& a.FirstName.Contains(firstName)
&& a.LastName.Contains(lastName)
select new SearchAndMergeViewModel
{
FirstN = a.FirstName,
LastN = a.LastName,
DOB = a.getDateOfBirth
};
var queryB =
from b in _Elig_DB.PersonAlias
join a in _Elig_DB.PersonAttributes
on new { b.PersonID, b.FirstName, b.LastName }
equals new { a.PersonID, a.FirstName, a.LastName }
select new SearchAndMergeViewModel
{
FirstN = a.FirstName,
LastN = a.LastName,
DOB = a.getDateOfBirth
};
var results = queryA.Intersect(queryB);
return results.ToList();
}
我在使用时对你的代码进行了一些改进,但重要的是我将第一个结果转换为SearchAndMergeViewModel。
此外,删除了冗余的StartsWith(...)过滤器。
我假设PersonAttributes.getDateOfBirth是计算属性。如果没有,您也应该从第一个查询中删除ToList()。如果不需要,您不希望将整个表加载到EF中。
答案 1 :(得分:0)
我明白了。我需要在第一个查询中指定返回的列,因此它们都匹配:
public List<SearchAndMergeViewModel> SearchForMerge(string FName, string LName, string DOB)
{
var query = from p in _Elig_DB.PersonAttributes.ToList()
where p.getDateOfBirth == DOB &&
(p.FirstName.Contains(FName) || p.FirstName.StartsWith(FName) &&
p.LastName.Contains(LName) || p.LastName.StartsWith(LName))
select new SearchAndMergeViewModel
{
FirstName = p.FirstName,
LastName = p.LastName,
DOB = p.DOB,
PersonID = p.PersonID
};
var queryb = from a in _Elig_DB.PersonAlias.ToList()
join e in _Elig_DB.PersonAttributes.ToList() on a.PersonID equals e.PersonID
where a.FirstName == FName && a.LastName == LName
select new SearchAndMergeViewModel
{
FirstName = a.FirstName,
LastName = a.LastName,
DOB = e.DOB,
PersonID = a.PersonID
};
var results = query.Union(queryb).ToList();
return results;
}