在Queryable类中定义新的扩展方法

时间:2015-12-02 08:53:38

标签: c# asp.net-mvc linq

我正在使用mvc 5并想在类FindMessageAsync中定义扩展方法Queryable(命名空间System.Linq)。

我通常用这种方式在数据库中获取一些记录:

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

更新

this question的答案无法解决我的问题。

2 个答案:

答案 0 :(得分: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

但是,您应该三思而后行,是否真的想在扩展方法中实现特定于域的逻辑......

答案 1 :(得分:1)

如果您想要单个项目,.FirstOrDefault(以及First Single等相关方法)是最佳选择,实际上没有必要实现另一个扩展方法并将其包装起来。

如果您想要一个异步列表,可能需要.ToListAsync方法。