2016-07-27 2 views
0

Как получить представление отображения/описания в запросе LINQ?Получить отображение в LINQ

Например

var query = dbo.Records.AsQueryable() 
       .Select(x => new 
       { 
        Id = x.Id, 
        Care = new 
        { 
         x.StartDate, 
         x.ForwardedBy, 
        }, 
        Prescriptions = x.Prescriptions.Select(p => new 
        { 
         p.Medicament, 
         p.IntervalUse //My Enum, how get Display name? 
        }), 
       }).OrderByDescending(x => x.Id); 

Этот запрос является ExampleAnd мне нужно быть AsQueryable генерировать быстрый запрос в моей базе данных

+0

Любая причина, вы не можете просто держать его как 'enum' и получить отображаемое имя на ваш взгляд, или в форме? Это было бы, как правило, предпочтительным методом. –

+1

Что значит Показать/описать? у вас есть [DisplayNameAttribute] s в вашем перечислении, или вы говорите об имени enum –

+0

@JoshK Я возвращаюсь к json – user98498

ответ

0

Я бы использовать System.Reflection библиотеки.

public static GetMyEnumDisplayName(MyEnumType value) 
{ 
    var displayAttribute = value.GetType() 
     .GetTypeInfo() 
     .GetDeclaredField(result) 
     .GetCustomAttribute(typeof(DisplayAttribute)); 

     if (displayAttribute != null) 
     { 
      var Name = ((DisplayAttribute)displayAttribute).Name; 
     } 
} 

Это не поддерживается в linq для объектов, но вы можете вместо этого сделать это вспомогательным свойством в своей модели просмотра.

Ваш первый шаг, чтобы выбрать модель представления вместо анонимного объекта следующий шаг, чтобы добавить функцию в инкубаторе

public string EnumDisplayValue { get { return GetMyEnumDisplayName(MyEnumValue); } } 
+0

Как я использую запрос linq? – user98498

+0

@ user98498 сделать этот код в методе и вызвать этот метод из запроса linq –

+0

не работает Sam ... – user98498

1

Поскольку LINQ не знает о том, что метод расширения, вы будете сначала нужно перечислить, а затем получить атрибут с помощью отражения.

public static class EnumExtensions 
{ 
    public static string GetDisplayName(this Enum value) 
    { 
     var attribute = (DisplayNameAttribute) value.GetType() 
      .GetField(value.ToString()) 
      .GetCustomAttributes(false) 
      .Where(a => a is DisplayNameAttribute) 
      .FirstOrDefault(); 

     return attribute != null ? attribute.DisplayName : value.ToString(); 
    } 
} 

я не могу проверить это прямо сейчас, но вы можете попробовать это и дайте нам знать, если он работает:

var query = dbo.Records.Include(x => x.Prescriptions).OrderByDescending(x => x.Id).AsEnumerable() 
      .Select(x => new 
      { 
       Id = x.Id, 
       Care = new 
       { 
        x.StartDate, 
        x.ForwardedBy, 
       }, 
       Prescriptions = x.Prescriptions.Select(p => new 
       { 
        p.Medicament, 
        p.IntervalUse.GetDisplayName() 
       }), 
      }); 
+0

Как я использую запрос LINQ? – user98498

+0

Вы не можете использовать его в запросе LINQ, если вы уже не перечислили 'IQueryable', потому что для LINQ для Entities нет сопоставления. –

+0

Wtf? почему ef имеют поддержку перечисления, если не поддерживают linq перечисление? : | – user98498

0

Это не может быть плохой идеей написать метод enum расширение, если это то, что вы собираетесь часто нужно:

public static string Describe(this Enum enumVal) 
{ 
    var type = enumVal.GetType(); 
    var memInfo = type.GetMember(enumVal.ToString()); 
    var attributes = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); 
    return (attributes.Length > 0) ? ((DescriptionAttribute)(attributes[0])).Description : enumVal.ToString(); 
} 
0

почему вы не идете на самый простой способ:

public enum IntervalUse 
    { 
     Hourly, 
     Daily, 
     Weekly 
    } 

    public static class EnumExt 
    { 
     public static string GetDescription(this IntervalUse item) 
     { 
      switch (item) 
      { 
       case IntervalUse.Hourly: 
        return "Hour by hour"; 
       case IntervalUse.Daily: 
        return "Day by day"; 
       case IntervalUse.Weekly: 
        return "Each week ..."; 
       default: 
        throw new ArgumentOutOfRangeException(nameof(item), item, null); 
      } 
     } 
    } 

, то вы можете позвонить в запросе: p.IntervalUse.GetDescription()

Смежные вопросы