【问题标题】:Dynamic linq query with join带连接的动态 linq 查询
【发布时间】:2016-02-07 01:20:53
【问题描述】:

这是我尝试使用连接进行动态 Linq 查询。我尝试获取数据库中上次阅读时出现的独特类别、品牌和其他标准的列表。传递给查询的内容(品牌、类别等)只会在运行时定义。

我读到了使用 func、谓词等执行此操作的最佳方法,我认为这超出了我现阶段的能力。我正在尝试使用查询字符串更简单的方法,我正在为一些更简单的情况工作,但是我在加入时做错了。如果我只是用智能感知做简单的select product.Category,这当然可以,但不能在 select 子句中的字符串中。

  public IEnumerable<string> getFilterItems(string dbColumn)
    {
        var filterItems = new List<string>();

        return (from reading in Helper.LatestReadings
                where reading.Distributor != Helper.Client
                join product in Helper.Context.Products
                       on reading.ProductId equals product.SkuCode
                select ("product." + dbColumn)).Distinct();
    }

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    你可以使用反射来实现这个

    public IEnumerable<string> getFilterItems(string dbColumn)
        {
            var filterItems = new List<string>();
    
            var productList = from reading in Helper.LatestReadings
                    where reading.Distributor != Helper.Client
                    join product in Helper.Context.Products
                           on reading.ProductId equals product.SkuCode
                    select product;
             return productList.Select(x=>x.GetType().GetProperty(dbColumn).GetValue(x)).Cast<string>().Distinct();
    }
    

    【讨论】:

      【解决方案2】:

      "product." + dbColumn 的计算结果为 String,因此 select ("product." + dbColumn) 将返回此字符串 n 次,查询结果中的每个项目一次。

      This SO question 有一个答案,如果您想进行动态选择。它提出了一种方法,以便您可以编写类似的东西

      var result = list.Select( CreateNewStatement( "Field1, Field2" ) );


      编辑: 哦,对不起,我刚刚读到“动态 LINQ”here,因此我上面的答案可能没有那么有用。正如我在链接页面上看到的,它们在 Select 中使用以下格式。

      .Select("new(<ColumnName> as <DataMemberName>, ... )");
      

      在你的情况下,你应该尝试

      .Select("new(product" + dbColumn + " as Value)");
      

      【讨论】:

      • 不幸的是对我不起作用,另一个答案很完美。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 2016-10-16
      • 2011-06-13
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      相关资源
      最近更新 更多