2016-03-23 41 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