2015-12-02 4 views
0

Я использую mvc 5 и хочу определить метод расширения FindMessageAsync в классе Queryable (namespace System.Linq).Определить новый метод расширения в классе Queryable

Я обычно использую этот способ, чтобы получить некоторые записи в базе данных:

public void GetMessage(string id) 
{ 
    using (var db = new MyDbContext()) 
    {  
    var message = db.Message.FirstOrDefault(x => x.Id == id); 
    //or 
    var _message = db.Message.Where(x => x.Id == id).ToList(); 

    //do stuff 
    } 
} 

Я хочу улучшить этот метод к:

public async Task<MessageViewModels> GetMessage(string id) 
{ 
    using (var db = new MyDbContext()) 
    {  
    var message = await db.Message.FindMessageAsync(x => x.Id == id); 

    if (message != null) 
    { 
     //string id = message.Id; 
     //string fromUser = message.FromUser; 
     //string toUser = message.ToUser; 
     //string content = message.Content; 
     //bool isRead = message.IsRead; 
    } 

    //do stuff 
    } 
} 

Мой вопрос: Как определить метод расширения FindMessageAsync?

UPDATE:

Ответы this question не решить мою проблему.

+0

Как вы думаете, это должен быть метод расширения IQueryable? Мне кажется, что это очень специфично для вашей модели домена. –

+0

@ DannyChen Пожалуйста, повторно откройте мой вопрос. Это не дублирует. –

+0

@ ЮвалИцчаков я. Класс 'Queryable' содержит метод расширения' IQueryable'. –

ответ

1
public static class MyQueryableExtensions { 
    public static Task<T> FindMessageAsync<T>(this IQueryable<T> source, Expression<Func<T, bool>> predicate) { 
     if(source == null) { 
      throw new ArgumentNullException("source"); 
     } 
     // Or whatever... 
     return source.FirstOrDefault(predicate); 
    } 
} 

важных вещей, что ваш метод определен в классе static, что ваш метод объявлен static и что первый параметр имеет модификатор this. Неважно, где именно находится метод, если это статический класс. Это не должно быть System.Linq.Queryable.

Однако, вы должны дважды подумать, действительно ли вы хотите реализовать логику конкретного домена в методах расширения ...

+0

Возможный 'T' -' MessageViewModels' :) –

+0

@HappyCoding, который можно вывести из использования метода;) Однако, как сказал @Danny Chen, на самом деле не обязательно предоставлять обертку вокруг 'FirstOrDefault'. Это может означать, что здесь есть дополнительная логика (хотя, как я уже сказал, для этого могут быть лучшие места, чем методы расширения). Каков ваш конкретный прецедент? –

1

Если вы хотите, один элемент, .FirstOrDefault (а также связанные с ними методы, как FirstSingle) это лучший выбор, нет необходимости реализовывать другой метод расширения и обертывать его.

Если вам нужен асинхронный список, возможно, вам нужен метод .ToListAsync.

+0

Yup. 'await db.Message.Where (x => x.Id == id) .ToListAsync()' = 'await db.Message.FindMessageAsync (x => x.Id == id)' –

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