C# 从LINQ查询中选择列

C# 从LINQ查询中选择列,c#,linq-to-sql,datagridview,C#,Linq To Sql,Datagridview,我希望能够选择在我的DataGridView中显示的列。也就是说,我有一个linq查询,它返回一个IEnumerable,但我不想显示策略的所有属性——我想让用户选择要显示的内容。因此,我认为类似这样的方法可以创建一个“更窄”的对象,其中只包含我想要的列 IEnumerable<Policy> policies = repository.GetPolicies(); var results = from p in policies select new { if (userP

我希望能够选择在我的DataGridView中显示的列。也就是说,我有一个linq查询,它返回一个IEnumerable,但我不想显示策略的所有属性——我想让用户选择要显示的内容。因此,我认为类似这样的方法可以创建一个“更窄”的对象,其中只包含我想要的列

IEnumerable<Policy> policies = repository.GetPolicies();
var results = from p in policies select new {
    if (userPicked("PropertyOne")) PropertyOne = p.PropertyOne,
    if (userPicked("PropertyTwo")) PropertyTwo = p.PropertyTwo,
    ...
};
dataGridView1.DataSource = results;
IEnumerable policies=repository.GetPolicies();
var结果=从政策中的p选择新{
如果(userPicked(“PropertyOne”))PropertyOne=p.PropertyOne,
如果(userPicked(“PropertyTwo”))PropertyTwo=p.PropertyTwo,
...
};
dataGridView1.DataSource=结果;
有没有一种优雅的方法可以做到这一点

第2部分: 为什么这样做有效:

IEnumerable<Policy> policies = repository.GetPolicies();
dataGridView1.DataSource = policies;
IEnumerable policies=repository.GetPolicies();
dataGridView1.DataSource=策略;
但这并不是:

IEnumerable<Policy> policies = repository.GetPolicies();
var results = from p in policies select p;
dataGridView1.DataSource = results;
IEnumerable policies=repository.GetPolicies();
var结果=从政策中的p选择p;
dataGridView1.DataSource=结果;
在第二种情况下,网格中不显示任何内容。

如果需要动态选择字段,请使用。它包含一个接受字段字符串的
Select
扩展方法,因此您可以决定在运行时选择哪些字段:

public static IQueryable Select(this IQueryable source,    
       string selector, params object[] values);
用法示例:

var products = db.Products
    .Where(condition)
    .OrderBy("Name")
    .Select(" new (ItemId,Name,Model,onsale)");
第2部分:网格需要一个可绑定的接口,例如
IList
,但是第二个代码示例返回一个
IQueryable
。您可以通过调用
ToList()
将其转换为
IList

如果需要动态选择字段,请使用。它包含一个接受字段字符串的
Select
扩展方法,因此您可以决定在运行时选择哪些字段:

public static IQueryable Select(this IQueryable source,    
       string selector, params object[] values);
用法示例:

var products = db.Products
    .Where(condition)
    .OrderBy("Name")
    .Select(" new (ItemId,Name,Model,onsale)");
第2部分:网格需要一个可绑定的接口,例如
IList
,但是第二个代码示例返回一个
IQueryable
。您可以通过调用
ToList()
将其转换为
IList