2012-11-20 16 views
0

我正在開發一個asp mvc應用程序。 我在一起查詢2個不同表中的名稱列表,然後將它們放在一起。該查詢是在一個方法,所以我可以很容易地調用它。我遇到的問題是我得到一個錯誤,無論我是否嘗試聯合或交叉。錯誤是:LINQ查詢,使用聯合還是相交?

「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的類型參數不能從使用推斷。」

任何想法?

回答

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

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