2014-09-06 71 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 */);