2015-04-29 2 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, который не применяется, спасибо tho. –

+0

@AdamReed, вы посмотрели http://stackoverflow.com/questions/1465700/system-linq-dynamic-select-new-into-a-listt-or-any-other-enumerabl – Alex

+0

@EugenePodskal Я ценю ваши усилия ! –

ответ

1

В одном из моих случаев использования я преобразовал результаты List<string[]> через расширение для IQueryable. Поскольку я знаю свой порядок столбцов в 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 
    } 
}); 
Смежные вопросы