删除LINQ查询之间的冗余

时间:2011-04-15 13:32:09

标签: linq c#-4.0

我需要多次调用相同的LINQ查询,只在“where”子句中有不同的元素。我不是一遍又一遍地重复LINQ查询,而是想将这些元素传递给单个查询,但是我对如何做到这一点感到很吵。

现在我的基本LINQ查询如下所示:

return from a in _repository.GetApps()
                       join set in _repository.GetSettings() on a.id equals set.application_id
                       join type in _repository.GetSettingsTypes() on set.setting_type_id equals type.id
                       join ent in _repository.GetEntities() on a.entity_id equals ent.id
                       where ent.ROW_ID == app && set.application_id == id && (set.setting_type_id==81 || set.setting_type_id==82 || set.setting_type_id==83)
                       orderby set.application_id, type.ordinal
                       select new Settings { app_name = a.name, data_type = type.data_type, setting_name = type.name, setting_description = type.description, setting_value = set.setting_value, entity_name = ent.name, entity_num = ent.ROW_ID };

“where”子句仅按ID列出设置类型。其他调用只会将“where”子句替换为更多或更少的设置ID,然后返回到视图。如何动态替换“where”子句或设置ID?我可以简单地将字符串或数组分配给第二个“&&”之后的设置列表(这似乎不起作用)?或者Lambdas会在这里帮助(我也无法让它工作)?谢谢!

2 个答案:

答案 0 :(得分:2)

您可以将数组与Contains()查询结合使用:

var settingTypeIds = new[] { 81, 82, 83 };

return from a in _repository.GetApps()
..
where ent.ROW_ID == app 
      && set.application_id == id 
      && settingTypeIds.Contains(set.setting_type_id) 

答案 1 :(得分:0)

您是否必须使用查询语法?你能使用LINQ扩展方法并将不同的lambda表达式传递给Where方法吗?