2016-03-23 63 views
2

我試圖削減這個LINQ下來重構Linq查詢

var sys = db.tlkpSystems 
.Where(a => db.tlkpSettings.Where(e => e.Hidden < 3) 
.Select(o => o.System) 
.ToList().Contains(a.System))  //cannot get this part in? 
.OrderBy(a => a.SystemName).ToList(); 

foreach (var item in sys) 
    model.Add(new SettingSystem { 
     System = item.System, 
     SystemName = item.SystemName 
}); 

我曾嘗試以下:

List<SettingSystem> model = new List<SettingSystem>(); 
    model = db.tlkpSettings.Where(e => e.Hidden < 3) 
    .OrderBy(e => e.Setting) 
    .Select(e => new SettingSystem 
    { 
     System = e.System, 
     SystemName = e.Setting 
     }).ToList(); 

我怎樣才能調用。載我的查詢(a.System)部分?

感謝

+0

@Mafii任何原因.ToList()不應該被使用?我是新來的linq – Haris

+1

這是LINQ to Entities查詢嗎? –

+0

是的。 http://stackoverflow.com/questions/15516462/is-there-a-performance-impact-when-calling-tolist – uTeisT

回答

3

與LINQ合作實體時,一些通用規則:使用ToList查詢裏面

  • 避免。它阻止EF構建正確的SQL查詢。

  • 當使用實體(表格)時,不要使用Contains。使用Any或連接。

這裏是你的查詢(如果System不是一個實體導航屬性):

var sys = db.tlkpSystems 
    .Where(a => db.tlkpSettings.Any(e => e.Hidden < 3 && e.System == a.System)) 
    .OrderBy(a => a.SystemName).ToList(); 
+1

謝謝!我之後是什麼 – Haris

+0

似乎不需要'ToList()',因爲他所做的全部都是迭代的。 –

+0

到列表是需要的,因爲我返回一個列表 – Haris

1

作爲附錄,也有AsEnumerable當你必須拉查詢到內存(如調用另一個子句中的方法)。這通常比ToListToArray更好,因爲它會枚舉查詢而不是枚舉,並將一個List/Array枚舉出來,然後枚舉該集合。

+0

感謝您的額外信息:) – Haris