带连接的动态linq查询

时间:2016-02-06 16:44:17

标签: c# linq

这是我尝试使用join的动态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();
    }

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

"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)");