2015-04-29 28 views
2

我正在使用Linq.Dynamic Library和EF6。我試圖從我的用戶選擇的數據庫中只選擇字段。轉換從Linq.Dynamic返回的對象

但是,所有返回的是一個List<object>,我試圖Cast<dynamic>,我可以想到的任何方式,但不管對象有0個字段。

我也試過明確聲明爲IEnumerable,這也是不成功的,並且無法呼叫.ToList(),而沒有首先調用Cast<T>,這也是不成功的。

將其中一個對象轉換爲string時,我得到:"{filenumber=345400, custom2=, custom3=, custom6=4076995332, custom8=4072121417}"

數據正在返回我根本無法將其轉換爲適當的類型。

var query = cmax.dbases 
    .Where(w => statuses.Any(a => w.statusname == a) && portfolios.Any(a => w.portfolio == a)) 
    .Select(string.Format("new ({0})", string.Join(",", fields))) 
    .Take(Math.Min((int) takeAmount, count - taken)); 

var take = await query.ToListAsync(); 

take.ForEach(data => { 
    var type = take.GetType(); 
    var properties = type.GetProperties(); 
    var propCount = properties.Count(); 
    properties.ToList().ForEach(prop => { 
     var name = prop.Name; 
    }); 
}); 
+0

@ MUG4N我正在使用Linq.Dynamic,不適用,謝謝你。 –

+0

@AdamReed,你看着http://stackoverflow.com/questions/1465700/system-linq-dynamic-select-new-into-a-listt-or-any-other-enumerabl – Alex

+0

@EugenePodskal我很欣賞你的努力! –

回答

1

在我的一個用例中,我通過IQueryable的擴展將結果轉換爲List<string[]>。因爲我知道我在Select(「New(columnNames ...)」)中的列順序,我可以很容易地找出哪一個是哪個。

所以這裏是擴展的代碼

public static IList<string[]> ToStringArray(this IQueryable queryFinal) 
{ 
    var query = (IQueryable<dynamic>)queryFinal; 
    IList<dynamic> data = query.ToList(); 
    System.Reflection.PropertyInfo[] props = null; 
    if (data.Count > 0) props = data[0].GetType().GetProperties(); 
    if (props == null) return new List<string[]>(); 
    /*I do other things using reflection here*/ 
    return data.Select(d => props.Select(p => (p.GetValue(d, null) ?? string.Empty).ToString()).OfType<string>().ToArray()).ToList(); 
} 

使用它作爲

var result = query.ToStringArray(); 
0

唯一可行的解​​決方案,我發現是手工解析字符串中的數據:

take.ForEach(data => 
{ 
    var dbtrData = new DebtorData(); 
    var cleaned = data.ToString().Replace("{", "").Replace("}", ""); 
    var pairs = cleaned.Split(','); 
    pairs.ToList().ForEach(pair => 
    { 
     var key = pair.Split('=')[0].Replace(" ", ""); 
     var value = pair.Split('=')[1]; 
     //USEDATA 
    } 
});