使用动态Linq处理动态选择

时间:2009-12-01 16:33:01

标签: c# linq linq-to-sql dynamic-linq

我正在使用Scott Guthrie描述的动态Linq库here

Scott Guthrie的例子很棒,我使用了动态Where语句。

然而,现在,我面临着需要使用动态选择功能的情况。 Scott Guthrie展示了这个功能的截图(在文章的最后一个截图中),但非常巧妙地从未解释过它。

问题是,即使代码编译并运行,我也看不出它是如何以任何有用的方式工作的。或许有反思?

以下是一个示例(请记住,您必须使用Guthrie在上面的文章中描述的Dynamic Linq库,这不是正常的Linq System.Linq)。

在我的示例中,我有一个带有UserId,FirstName和LastName字段的Users表。但是你使用什么数据库并不重要。这个问题很容易重现。这是我的示例代码:

首先确保您在顶部使用此声明:

    using System.Linq.Dynamic;

然后您可以运行以下代码:

using (DataClasses1DataContext dcdc = new DataClasses1DataContext())
        {
            var x = dcdc.Users.Select("new(UserId, FirstName, LastName)");
            foreach (var item in x)
            {                    

                Console.WriteLine(item.ToString());
            }
        }

正如您所看到的,这编译并运行得很好。您将从数据库中获取所有记录。但是,我无法找到实际访问新匿名类型的成员。

因为Select查询是一个字符串,所以在设计时没有类型推断。所以我不能写:

Console.WriteLine(item.UserId);

编译器不知道匿名类型项具有名为UserId的成员。因此代码甚至不会编译(即使你在For..Each循环期间暂停调试器,你会看到调试窗口看到有UserId,FirstName和LastName成员。

那么......这应该如何运作?如何获得匿名类型成员的访问权限?

1 个答案:

答案 0 :(得分:4)

它可以很好地用于数据绑定(我怀疑这是它的预期用例),它在引擎盖下使用反射。它也适用于.NET 4.0中的dynamic

foreach (dynamic item in x) { 
    Console.WriteLine(item.UserId);
}

除此之外......反思或TypeDescriptor

foreach (object item in x) {
    Console.WriteLine(item.GetType().GetProperty("UserId").GetValue(item, null));
}