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

本文关键字:对象 获取 字段 属性 linq 创建 | 更新日期: 2023-09-27 18:28:29

我很难弄清楚我做错了什么。我有一些返回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>吗?

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

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

通过匿名类型(C#编程指南)

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

您有没有考虑过做一些类似的事情:db.Users.Select(u => new UserDto() { Id = user.Id, Name = ...,其中UserDto是一个专用类,具有您将来需要的所有属性?我认为当您从匿名类转换为Object时,会丢失有关属性的信息。尽管如此,我从未尝试从匿名类中获取成员信息