LINQ查询,使用Union还是Intersect?

时间:2012-11-20 18:12:31

标签: sql-server linq-to-entities

我正在开发一个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的类型参数。”

有什么想法吗?

2 个答案:

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