重构Linq查询

时间:2016-03-23 15:51:22

标签: c# 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();

如何在查询中调用.Contains(a.System)部分?

由于

2 个答案:

答案 0 :(得分:3)

使用LINQ to Entities时的一些一般规则:

  • 避免在查询中使用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 :(得分:1)

作为附录,当必须将查询拉入内存时(例如在另一个子句中调用方法),还有AsEnumerable。这通常比ToListToArray好,因为它会枚举查询,而不是枚举,将List / Array放在一起,然后枚举该集合。< / p>