带联接的动态 linq 查询

本文关键字:linq 查询 动态 | 更新日期: 2023-09-27 18:33:39

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

读到了使用函数、谓词等做到这一点的最佳方法,我认为这超出了我现阶段的能力。我正在尝试更简单的查询字符串方法,我为一些更简单的情况工作,但我在这里做错了 join。如果我只是简单地select product.Category智能感,这当然有效,但不是在选择子句中的字符串中。

  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();
    }

带联接的动态 linq 查询

您可以使用

反射来实现这一点

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();
}

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

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

变量结果 = 列表。选择( CreateNewStatement( "Field1, Field2" ) );


编辑:哦,对不起,我刚刚在这里读到了"动态LINQ",因此我上面的答案可能没有那么有帮助。正如我在链接页面上看到的那样,他们在选择中使用以下格式。

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

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

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