我正试图削减这个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)部分?
由于
答案 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
。这通常比ToList
或ToArray
好,因为它会枚举查询,而不是枚举,将List
/ Array
放在一起,然后枚举该集合。< / p>