Избегать внутреннего .ToList () в запросе LINQ? - PullRequest
0 голосов
/ 04 марта 2019

Я строю метод, который берет List<T> и превращает его в DataTabe.В процессе я хочу отфильтровать любые свойства, которые помечены атрибутом [NotMapped].

У меня весь метод работает, но я немного беспокоюсь об одной его части ... части, которая отсеивает свойства [NotMapped].Вот что у меня есть:

    public static DataTable CreateDataTable<T>(IEnumerable<T> list)
    {
        Type type = typeof(T);

        var properties = type.GetProperties().Where(p =>
                        p.CustomAttributes.ToList().Count == 0 ||
                        (p.CustomAttributes.ToList().Count > 0 && p.CustomAttributes.ToList()[0].AttributeType.Name != "NotMappedAttribute")
                        ).ToList();

        // Rest of the method...
    }

Итак, это работает так, как мне бы хотелось, и избавляется от всего, что выглядит так (например), поэтому оно не заканчивается в финале.DataTable:

    [NotMapped]
    public string Description { get; set; }

Я беспокоюсь о производительности и просто общем передовом опыте.Запрос var properties = LINQ мне кажется неуклюжим, но я не вижу более эффективного способа его улучшить.

А именно, я не люблю звонить p.CustomAttributes.ToList() 3 раза.Есть ли способ избежать этого?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Чтобы ответить на исходный вопрос, вы можете избежать многократного вызова ToList(), сохранив его возвращаемое значение:

type.GetProperties().Where(p =>
                    p.CustomAttributes.ToList().Count == 0 ||
                    (p.CustomAttributes.ToList().Count > 0 && p.CustomAttributes.ToList()[0].AttributeType.Name != "NotMappedAttribute")
                    )

... становится ...

type.GetProperties().Where(p => 
{
    var attrs = p.CustomAttributes.List();
    return attrs.Count == 0 || (attrs.Count > 0 && attrs[0].AttributeType.Name != "NotMappedAttribute");
})

Однако , я рекомендую вместо этого сделать следующее:

type.GetProperties().Where(p => p.GetCustomAttribute<NotMappedAttribute>() == null))

Это короче и проще для понимания с первого взгляда.

0 голосов
/ 04 марта 2019
private IEnumerable<PropertyInfo> GetPropertiesWithoutAttribute<TAttribute>(Type type) 
    where TAttribute : Attribute
{
    return type.GetProperties().Where(p => !p.GetCustomAttributes<TAttribute>().Any());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...