我有一个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不允许这样的逻辑。任何帮助将不胜感激
答案 0 :(得分:3)
答案 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();
这假设nodeTable
是IEnumerable<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
类型的更多细节,我可以引导你完成这个。