2014-09-06 70 views
1

我在我的数据库中有一个对象,即具有10个属性。 现在我想,让用户选择他们中的一些(1或2,其中多达10),然后通过用户的选择,根据我就与用户 ,我认为有关场景选择的属性对象的名单是这样的:如何从数据库中选择多列从用户在列中获取列

与复选框一个页面,显示的是下贱的属性(列),然后用户选择他们每个人他需要。

但这里是我的问题,如何让运行的查询选中的复选框? 例如,用户选择了col 1,col 2,col 6,col 10,我该如何编写一个负责用户选择的查询? 例子我想这个有意义的短语:

var file2 = file.Select(f => new { "attributes selected by user" }).OrderBy(what user wants) 
+0

对不起,我真的不明白你想什么来完成 – Pleun 2014-09-06 13:34:53

+0

什么是你用你的LINQ查询转换为数据库调用 - 例如实体框架还是老派的linq-to-sql? – Rhumborl 2014-09-06 13:36:53

+0

@Pleun我想我解释清楚 想象一下数据库中的一个表10列。 用户想要打印该表中的所有行但不是所有的cols,只是想打印一些他们 我给用户复选框的选择,他想打印 的cols,但我不知道如何编写选择代码用户选择的列(他选择的复选框) – user3915488 2014-09-06 14:30:31

回答

0

他们在Nuget System.Linq.Dynamic库是很长的路要走

[TestMethod] 
public void StringyAndDangerous() 
{ 
    var fakePersonDbSet = new List<Person> { new Person() { FirstName = "Some", LastName = "Guy" } }.AsQueryable(); 
    var attributes = new string[] { "FirstName", "LastName" }; 
    var selectedFields = String.Join(",", attributes); 
    var exprssion = string.Format("new ({0})", selectedFields); 
    var result = fakePersonDbSet.Select(exprssion, attributes).Cast<dynamic>().First(); 
} 

但你松散型的安全和编译ŧ ime检查。您可能会更好采取另一种方法

[TestMethod] 
public void SlowerButSafer() 
{ 
    var fakePersonDbSet = new List<Person> { new Person() { FirstName = "Some", LastName = "Guy" } }.AsQueryable(); 
    var attributes = new string[] { "FirstName", "LastName" }; 
    var personPropertylist = CovertToKeyValuePair(fakePersonDbSet.First()) 
     .Where(c=> attributes.Contains(c.Key)) 
     .ToArray();    
} 

private IEnumerable<KeyValuePair<string, object>> CovertToKeyValuePair<T>(T @object) 
{ 
    var result = new List<KeyValuePair<string, object>>(); 
    var properties = typeof (T).GetProperties(); 
    foreach (var property in properties) 
    { 
     result.Add(new KeyValuePair<string, object>(property.Name, property.GetValue(@object, null))); 
    } 
    return result; 
} 

,你会采取的性能损失都为拉动从数据库字段,你不需要和使用反射但代码将是不容易出错,你赢了”最终会出现尝试选择不存在的列的错误。

0

使用DynamicLinq。 (link

扩展方法:

public static T GetValue<T>(this DynamicClass dynamicObject, string propName) 
{ 
    if (dynamicObject == null) 
    { 
     throw new ArgumentNullException("dynamicObject"); 
    } 

    var type = dynamicObject.GetType(); 
    var props = type.GetProperties(BindingFlags.Public 
           | BindingFlags.Instance 
           | BindingFlags.FlattenHierarchy); 
    var prop = props.FirstOrDefault(property => property.Name == propName); 
    if (prop == null) 
    { 
     throw new InvalidOperationException("Specified property doesn't exist."); 
    } 

    return (T)prop.GetValue(dynamicObject, null); 
} 

public static string ToDynamicSelector(this IList<string> propNames) 
{ 
    if (!propNames.Any()) 
     throw new ArgumentException("You need supply at least one property"); 
    return string.Format("new({0})", string.Join(",", propNames)); 
} 

用法:

using System.Linq.Dynamic; 

// .. 

var columns = new[] { "col1", "col2", etc }; 

var result = context.Files.OrderBy(file => file.Id) 
          .Select(columns.ToDynamicSelector()) 
          .Cast<DynamicClass>.ToList(); 

结果将是DynamiClass实例wchich列将包含所选属性的的收集。

DynamicClass获取单个属性:

var columnValue = result.First().GetValue<string>("col1"); 

如果你想从IEnumerable得到的值:

var list = new List<File> { File1, File2, etc.. }; 

var result = list.AsQueryable().Select(/* the same as above */);