2

我很难弄清楚我在这里做错了什么。我有一些返回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()在该调用中插入 a 。

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>别的东西代替吗?

4

2 回答 2

2

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

于 2013-08-20T11:47:59.940 回答
2

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

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

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

于 2013-08-20T12:20:15.723 回答