我正在使用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的答案无法解决我的问题。
答案 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
方法。