【问题标题】:Converting object returned from Linq.Dynamic转换从 Linq.Dynamic 返回的对象
【发布时间】:2015-07-09 03:55:36
【问题描述】:

我正在使用Linq.Dynamic Library 和 EF6。我试图从我的用户选择的数据库中只选择字段。

但是,返回的只是一个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;
    });
});

【问题讨论】:

  • @MUG4N 我正在使用 Linq.Dynamic,这不适用,谢谢。
  • @EugenePodskal 感谢您的努力!
  • @AdamReed 奇怪的是,他们决定使用括号而不是花括号,就像在 C# 中用于匿名对象一样。也许这样做正是为了避免需要逃脱大括号。
  • @Alex 是的,如您所见,我在这里使用反射,并返回 0 个属性。我不知道选项2是什么。至于选项 3,我正在使用 NuGet 上提供的库,并且想寻找一个不需要我在库上扩展的选项。我相信应该有一个简单的方法来Cast返回的对象,我忽略了。

标签: c# linq entity-framework dynamic dynamic-linq


【解决方案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();

【讨论】:

    【解决方案2】:

    我找到的唯一可行的解​​决方案是手动解析字符串中的数据:

    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
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多