2014-02-11 132 views
2

我有 EF實體:Appeal,AppealPerson,Person從LINQ連接表中連接列

AppealPerson實體可以通過AppealPerson實體加入(多對多關係)。 我想選擇具有連接人員全名的申訴。

+----------+----------+--------------------------------------------------+ 
| AppealId | Appeal.* | Person.Surname + Person.Name + Person.MiddleName | 
+----------+----------+--------------------------------------------------+ 
| 1  | ..info.. | Aaa Aaa Aaa, Bbb Bbb Bbb, Ccc Ccc Ccc   | 
+----------+----------+--------------------------------------------------+ 
| 2  | ..info.. | Aaa Aaa Aaa, Bbb Bbb Bbb       | 
+----------+----------+--------------------------------------------------+ 

現在,我使用這個查詢:

context.Appeals 
.Select(a => new 
{ 
    Appeal = a, 
    Persons = a.AppealPersons 
    .Select(ap => ap.Person) 
    .Select(p => new { p.Surname, p.Name, p.MiddleName }) 
    .ToList() 
}) 
.AsEnumerable() 
.Select(a => new 
{ 
    Id = a.Appeal.Id, 
    Persons = a.Persons.Select(p => string.Format("{0} {1} {2}", p.Surname, p.Name, p.MiddleName).Trim()), 
}) 
.ToList<object>(); 

這個查詢是很慢的。列出在30秒內生成的約500行。 請幫助優化查詢。

+0

你檢查SQL - 探查?它會生成一個sql查詢還是爲每個上訴做一個查詢? –

回答

0

嘗試用加入如:

from a in context.Appeals 
join ap in context.AppealPerson 
on a.Id equals ap.AppealId 
join p in context.Person 
on p.Id equals ap.PersonId 
... 
+0

當然加入會更慢? – James

+0

以及如何連接完整名稱? – acelot

+1

@詹姆斯不一定,他的LINQ查詢可能會產生幾個SQL查詢,這就是爲什麼我建議給它一個嘗試。 – jnovo

0

看你的關係,我覺得你可以用GroupBy條款做到這一點。由於格式有發生客戶端會少一點混亂,如果你要麼有一個函數,它包裹起來這個,或者甚至更好,覆蓋ToStringPerson

public partial class Person 
{ 
    ... 
    public string override ToString() 
    { 
     return String.Format("{0} {1} {2}", Surname, Name, MiddleName).Trim(); 
    } 
} 
... 
context.AppealPersons 
    .GroupBy(ap => ap.Appeal.Id, ap => ap, 
     (key, g) => new { 
      AppealId = key, 
      Appeal = g.FirstOrDefault().Appeal, 
      Persons = String.Join(",", g.Select(x => x.Person).AsEnumerable() 
       .Select(p => p.ToString())) 
     }) 
    .ToList(); 
+0

謝謝你的回答。我有一個問題:如果上訴沒有任何人這是在查詢結果中出現? – acelot

+0

在這種情況下'人物'應該返回一個空字符串,你仍然應該得到'上訴'信息,不過因爲你正在用'Appeal.Id'分組,所以人們實際上只是你追加到結果中的額外元數據。 – James

+0

你應該知道,如果上訴沒有任何人,那麼沒有任何AppealPerson與這Appeal.Id。我也想和任何人展示上訴。 – acelot