C# LINQ - 在运行时更改所选字段

3
我是一个有用的助手,可以翻译文本。

我有一个名为Orders的对象(Order,Product,Cost,Price,Client,Day)。

我需要从数据库中检索大量记录,并为了方便过滤,需要使用所检索到的不同值来填充DropDownLists,以便用户可以选择特定日期、特定产品甚至特定价格。 DropDownList的ID是根据相应字段的名称创建的,格式为“ddl_”+名称。

我希望能够定义一个简单的数组,如下所示:

public string[] filterArray = new string[] { "Order", "Product", "Cost", "Price", "Client", "Day" };

然后调用 BindDLLs 方法:
foreach (string filterName in filterArray)
{
    // Find the ddl to populate
    DropDownList ddl = (DropDownList)this.FindControl("ddl_" + filterName);
    // Get the data for that ddl only (use filterName in the select...)
    var query = (from items in results select items.filterName.ToString()).Distinct();

    // Populate the ddl (not complete code...)
    foreach (var item in query)
    {
        ddl.Items.Add(item...);
    }
}

我的问题是,我在运行时发现有很多关于如何修改linq语句中的WHERE、GROUP BY或其他部分的文档,但我找不到任何关于如何动态更改我想要检索的字段的文档。
有没有简单的方法可以做到这一点?谢谢。 Yipi
编辑:
List<Orders> results = OrdersService.GetOrders();

public class Orders
{
    [DataMember]
    public DateTime? Day
    [DataMember]
    public int? Order
    [DataMember]
    public int? Product
    [DataMember]
    public int? Cost
    [DataMember]
    public int? Price
    [DataMember]
    public int? Client
    [DataMember]
}
2个回答

2

你可以通过手动构建 lambda 表达式来解决这个问题。

你目前使用的查询可以更改为使用方法链语法,然后它将是这样的:

var query = results.Select(item => item.<filterName>.ToString()).Distinct();

现在我们需要创建lambda表达式,将其传递给Distinct方法。

可以使用以下方法实现:

Expression<Func<YourResultType, string>> CreateExpression(string propertyName)
{
    var itemExpression = Expression.Parameter(typeof(YourResultType), "item");
    var propertyExpression = Expression.Property(itemExpression, propertyName);
    var toStringExpression = Expression.Call(propertyExpression,
                                             "ToString", null);
    return Expression.Lambda<Func<YourResultType, string>>(toStringExpression, 
                                                           itemExpression);
}

现在我们可以将查询更改为以下内容:
var query = results.Select(CreateExpression(filterName)).Distinct();

请注意,您需要将YourResultType更改为results变量中实例的类型。另外,如果您不是查询数据库而是内存列表,则需要将查询更改为以下内容:
var query = results.Select(CreateExpression(filterName).Compile()).Distinct();

抱歉,我不熟悉表达式树 - 对象“results”是一个简单的List<Orders>。当我使用你的代码时,我一输入就立即出现错误。有没有文档或指针可以提供?谢谢。 - yipiha
@yipiha:哦天啊...对不起。我尝试使用的过载在这里不存在。我已经修复了代码,请检查。 - Daniel Hilgarth
它编译通过,但在运行时出现以下错误:实例属性“Client”未为类型“MYTYPEHERE”定义...且类“Orders”中未定义任何属性。 - yipiha
@yipiha:好的,为了确保我们在谈论同一个问题:请使用以下细节更新您的问题:(1)请展示results是如何声明的,特别是它属于哪种类型。(2)请展示在results列表中的那个类的定义。 - Daniel Hilgarth
@yipiha:那段代码甚至无法编译...请修复。 - Daniel Hilgarth
显示剩余5条评论

0

1
很遗憾,我不能自由使用其他库。谢谢。 - yipiha
1
工作得非常好,我能够提出商业案例并获得使用它的授权 - 非常感谢! - yipiha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接