这是我尝试使用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();
}
答案 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)");