0

我正在开发一个 asp mvc 应用程序。我正在整理一个查询,其中包含来自 2 个不同表的 2 个名称列表,然后应该将它们放在一起。该查询在一个方法中,因此我可以轻松调用它。我遇到的问题是我得到一个错误,无论我是尝试联合还是相交。错误是:

“Model.PersonAttributes 不包含联合(或相交)和最佳重载的定义,等等等等……”

这是我的代码:

    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 的类型参数。”

有任何想法吗?

4

2 回答 2

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 中。

于 2012-11-20T18:58:02.230 回答
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;
    }
于 2012-11-20T19:37:03.027 回答