Linq查询问题 - 在运行时确定列

时间:2010-01-27 16:16:20

标签: c# linq lambda

我有一个linq问题(linq to sql)。我有以下代码,它工作正常;

       var queryx = (from sa in d1.SampleAttributes
                      where nodeTable.ToList().Distinct().Contains(sa.client_post_code_prefix)
                     select sa.SampleId).Distinct();

注意:nodeTable的类型为IQueryable

但是,我想更改它,以便可以在运行时决定contains方法中的列名。我根据正在应用的某些用户过滤器确定来自另一个查询的列名称,理想情况下会喜欢具有以下逻辑的内容;

//请注意我传入的字符串获取'列对象'总是与列名相同

        var columnWhatever = GetColumnName(string colName);

        var queryx = (from sa in d1.SampleAttributes
                      where nodeTable.ToList().Distinct().Contains(sa.client_post_code_prefix)
                     select sa.SampleId).Distinct();

到目前为止,我一直无法找到任何允许这样做的东西,我开始认为Linq不允许这样的逻辑。任何帮助将不胜感激

2 个答案:

答案 0 :(得分:3)

您可以查看Dynamic LINQ库。我发布了它here。看一看,看看这对你有帮助。另请参阅Scott Guthrie的帖子here

答案 1 :(得分:2)

如果这是LINQ to object,你可以使用反射很容易地做到这一点。即:

string colName;
var queryx = (from sa in d1.SampleAttributes
              where nodeTable.Contains(
                                 sa.GetType()
                                   .GetProperty(colName)
                                   .GetValue(sa, null)
                                   .ToString()
                             )
              select sa.SampleId).Distinct();

这假设nodeTableIEnumerable<string>

最好只执行一次反射片。假设sa的编译时类型是SampleAttribute。然后你可以做以下事情:

string colName;
PropertyInfo info = typeof(SampleAttribute).GetProperty(colName);
Func<SampleAttribute, string> func = sa => info.GetValue(sa, null).ToString();
var queryx = (from sa in d1.SampleAttributes
              where nodeTable.Contains(func(sa))
              select sa.SampleId).Distinct();

如果这是LINQ to SQL,您可以使用System.Linq.Expressions.Expression轻松完成此操作。如果你提供一些关于nodeTable类型的更多细节,我可以引导你完成这个。