【问题标题】:Removing redunancies between LINQ queries删除 LINQ 查询之间的冗余
【发布时间】:2011-04-15 13:32:08
【问题描述】:

我需要多次调用相同的 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 列出设置类型。其他调用将简单地用更多或更少的设置 id 替换“where”子句,然后返回到视图。如何动态替换“where”子句或设置 ID?我可以简单地将字符串或数组分配给第二个“&&”之后的设置列表(这似乎不起作用)吗?或者 Lambdas 会在这里提供帮助(我也无法让它发挥作用)?谢谢!

【问题讨论】:

    标签: linq c#-4.0


    【解决方案1】:

    您可以将数组与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) 
    

    【讨论】:

    • 这看起来很有希望。我会试一试。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 可能,但我不确定它是如何工作的。不过,我会调查一下。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多