尝试从(匿名类)对象linq获取属性/字段正在创建

时间:2013-08-20 11:42:02

标签: c# .net linq

我无法弄清楚我在这里做错了什么。我有一些返回IQuery对象的linq,稍后在代码中我试图列出返回的属性。这个缩写代码最好解释了这一点(实际的linq更复杂,涉及连接 - linq本身工作正常):

public IQueryable<Object> FindAll()
{
    var query = from user in _db.Users
    select new
    {
        id = user.Id,
        is_active = user.IsActive,
        email = user.Email,
        dob = user.Dob,
        user.user_type,
    };
    return query;
}

我在代码的其他地方:

query.ConvertToCsv();

虽然我也尝试在该通话中插入.toList()

ConvertToCsv有:

    public static string ConvertToCSV<TSource>(this IEnumerable<TSource> source)
    {
        StringBuilder sb = new StringBuilder();

        var properties = typeof(TSource).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

        var enumerable = source as IList<TSource> ?? source.ToList();
        if (!enumerable.Any()) return "";

        string headerString = "";

        foreach (var prop in properties)
        {
            headerString += (headerString.Length > 0 ? "," : "") + prop.Name;
        }
        sb.AppendLine(headerString);

        foreach (TSource item in enumerable)
        {
            string line = string.Join(",", properties.Select(p => p.GetValue(item).ToCsvValue()).ToArray());
            sb.AppendLine(line);
        }

        return sb.ToString();
    }

注意我还尝试使用以下代码提取属性名称:

PropertyInfo[] pi = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance);
var properties = pi.OrderBy(x => x.MetadataToken);
foreach (PropertyInfo p in properties)
{ etc etc }

在所有情况下,属性或字段列表返回一个空列表,因此,我无法遍历该对象以吐出标题行或数据行....遍历所有代码并检查变量表示一切正常,直到我到达getproperties / getfields行并且代码失败。

我犯的是什么新手错误?我应该用其他东西替换<Object>吗?

2 个答案:

答案 0 :(得分:2)

您是否考虑过这样的事情:db.Users.Select(u => new UserDto() { Id = user.Id, Name = ...,其中UserDto是专用类,具有您将来需要的所有属性?当您从匿名类转换为Object时,我认为您丢失了有关属性的信息。虽然,我从未尝试从匿名类

获取成员信息

答案 1 :(得分:2)

  

传递匿名类型或包含匿名的集合   types,作为方法的参数,可以将参数声明为   类型对象。但是,这样做会破坏强类型的目的。   如果必须存储查询结果或将其传递到方法之外   边界,考虑使用普通的命名结构或类而不是   匿名类型。

Anonymous Types (C# Programming Guide)

创建您自己的类并将方法声明更改为IQueryable<MyClass>而不是object