【问题标题】:linq - multiple where statements if variables are not nulllinq - 如果变量不为空,则使用多个 where 语句
【发布时间】:2016-06-28 14:31:07
【问题描述】:

我希望查询从 WANOM_DETAILS & STRDT tables where PIPELINE = 'F' AND HISTORICAL_FLAG <> 'T' AND INSTALLATION = 'EA' AND ANOMALY_CLASS = 'Critical'

if 语句正常工作,但目前查询仅从 WANOM_DETAILS & STRDT tables where ANOMALY_CLASS = 'Critical' 因为这是model.ToList(); 之前的最后一行

任何帮助将不胜感激。这是代码;

        strdt = "EA";
        anom_class = "Critical";

        var models = db.WANOM_DETAILS;

        var model = models.Where(wanom_details => wanom_details.STRDT.PIPELINE == "F");
        model = models.Where(wanom_details => wanom_details.STRDT.HISTORICAL_FLAG != "T");
        if (strdt != "")
        {
            model = models.Where(wanom_details => wanom_details.INSTALLATION == strdt);
        }
        if (anom_class != "")
        {
            model = models.Where(wanom_details => wanom_details.ANOMALY_CLASS == anom_class);
        }
        if (subdt != "")
        {
            model = models.Where(wanom_details => wanom_details.WANOM.SUBSTRUCTURE == subdt);
        }
        if (comp != "")
        {
            model = models.Where(wanom_details => wanom_details.WANOM.TYPE + "-" + wanom_details.WANOM.IDENT == comp);
        }

        return PartialView("_SiteAnomalyGridViewPartial", model.ToList());

【问题讨论】:

  • 不确定我是否理解这个问题,但会使用模型。除了第一个解决您的问题之外的所有地方都没有 s 的地方?
  • 您需要在模型上保留管道。到处都应该是models = models.Where
  • 是的,在除第一个以外的所有地方删除 s 已解决问题。谢谢!
  • 每个if 都可以覆盖model 实例,确定要这样做吗?

标签: c# linq if-statement where-clause


【解决方案1】:

你可以链接 Where 的结果,所以:

X.Where(x => x.Prop > 1 && x.Prop2 == "1")

可以实现两个Where的相同结果拼接:

X.Where(x => x.Prop > 1).Where(x.Prop2 == "1").

所以在你的情况下你可以这样做:

strdt = "EA";
anom_class = "Critical";

var models = db.WANOM_DETAILS;

models = models.Where(wanom_details => wanom_details.STRDT.PIPELINE == "F");
models = models.Where(wanom_details => wanom_details.STRDT.HISTORICAL_FLAG != "T");
if (strdt != "")
{
    models = models.Where(wanom_details => wanom_details.INSTALLATION == strdt);
}
if (anom_class != "")
{
    models = models.Where(wanom_details => wanom_details.ANOMALY_CLASS == anom_class);
}
if (subdt != "")
{
    models = models.Where(wanom_details => wanom_details.WANOM.SUBSTRUCTURE == subdt);
}
if (comp != "")
{
    models = models.Where(wanom_details => wanom_details.WANOM.TYPE + "-" + wanom_details.WANOM.IDENT == comp);
}

return PartialView("_SiteAnomalyGridViewPartial", models.ToList());

编辑:

当你使用一个长的Where 表达式,它与&& 运算符链接条件时,根据And 的条件生成的sql 生成。 但是,当您将IQueryable 与一些Where 表达式链接时,linq-to-sql 会为每个表达式生成单独的选择位置,并将所有内容包装在联合查询中。 db-server 可能会优化,但对我来说感觉很尴尬。 要获得第一个结果,您可以使用greate predicatebuilder 扩展方法:

strdt = "EA";
anom_class = "Critical";

var predicate = PredicateBuilder.False<ClassOfWANOM_DETAILS>();

predicate.And(wanom_details => wanom_details.STRDT.PIPELINE == "F");
predicate.And(wanom_details => wanom_details.STRDT.HISTORICAL_FLAG != "T");
if (strdt != "")
    predicate.And(wanom_details => wanom_details.INSTALLATION == strdt);
if (anom_class != "")
    predicate.And(wanom_details => wanom_details.ANOMALY_CLASS == anom_class);
if (subdt != "")
    predicate.And(wanom_details => wanom_details.WANOM.SUBSTRUCTURE == subdt);
if (comp != "")
    predicate.And(wanom_details => wanom_details.WANOM.TYPE + "-" + wanom_details.WANOM.IDENT == comp);

return PartialView("_SiteAnomalyGridViewPartial", db.WANOM_DETAILS.Where(predicate).ToList());

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    相关资源
    最近更新 更多