【问题标题】:extension for DbSetDbSet 的扩展
【发布时间】:2012-11-11 04:13:07
【问题描述】:

什么是 DbSet 的扩展?我想添加方法“FindTheLatest”。这是我的代码: 这是我的代码

公共静态列表 FindTheLatest(此 DbSet 评论,int nums) { 返回reviews.OrderByDescending(r => r.Created).Take(nums).ToList(); }

但它不起作用。我必须做什么?

这是我的扩展类:

public static class RestaurantReviewsExtenstion
{
    public static IEnumerable<Review> FindTheLatest(this IQueryable<Review> reviews, int nums)
    {
        return reviews.OrderByDescending(r => r.Created).Take(nums).ToList();
    }

    public static Review FindById(this System.Data.Entity.DbSet<Review> reviews, int id)
    {
        return reviews.SingleOrDefault(s => s.ReviewId == id);
        //return reviews.Find(item => item.Id == id);
    }

    public static Review FindTheBest(this List<Review> list)
    {
        return list.OrderByDescending(o => o.Rating).FirstOrDefault();
    }
}

这是我的 DBContex 类:

public class OdeToFoodDb: DbContext
{
    public DbSet<Restaurant> Restaurants { get; set; }
    public DbSet<Review> Reviews { get; set; }

    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Restaurant>()
            .HasMany(resturant => resturant.Reviews)
            .WithRequired(review => review.Resturant);
        base.OnModelCreating(modelBuilder);
    }
}

这是我得到错误的地方:

    OdeToFoodDb _db = new OdeToFoodDb();
    public PartialViewResult LatestReview()
    {
        System.Threading.Thread.Sleep(1500);
        //this is where i get error
        var review = _db.Reviews.FindTheLatest(1);
        //************************************
        return PartialView("_Review", review);
    }

抱歉信息不全。

【问题讨论】:

  • “它不起作用”从来没有能很好地描述问题所在。
  • 您遇到异常了吗?还是意想不到的结果?
  • 对不起,我是这个论坛的新手,我的英语很差:(

标签: c# asp.net winforms entity-framework


【解决方案1】:

您可以使用 Generic 实现扩展方法以接受任何类型:

public static class DbSetExtensions
{
    public static IQueryable<T> FindTheLast<T,TResult>(this IQueryable<T> t, Expression<Func<T, TResult>> expression, int nums) where T : class 
    {
      return t.OrderByDescending(expression).Take(nums);
    }
}  

并使用它:

dbContext.Entity.FindTheLast(x => x.Property,2);

【讨论】:

    【解决方案2】:

    一方面,List 是一个泛型类型。对于另一个DbSet 不是任何特定 类型的集合——您可能需要DbSet&lt;T&gt; 来获得一些合适的T。也许你的意思是:

    public static List<Review> FindTheLatest(this DbSet<Review> reviews, int nums)
    {
        return reviews.OrderByDescending(r => r.Created).Take(nums).ToList();
    }
    

    或者:

    public static List<Review> FindTheLatest(this DbSet reviews, int nums)
    {
        return reviews.Cast<Review>()
                      .OrderByDescending(r => r.Created)
                      .Take(nums)
                      .ToList();
    }
    

    【讨论】:

    • @SeyedMortezaMousavi:好吧,如果没有更多信息,我看不出我还能如何可能提供帮助。您是寻求帮助的人 - 您需要提供所有相关信息。请阅读tinyurl.com/so-hints
    • 在我的视频培训中使用了以下代码: public static IEnumerable FindTheLatest(this IQueryable reviews, int nums) { return reviews.OrderByDescending(r => r.Created).Take( nums).ToList(); } 但是,它也对我不起作用:(。
    • @SeyedMortezaMousavi 如果您要返回IEnumerable,为什么还要打电话给ToList()didn't works for me 是什么意思?它对你来说太绿了,还是太热了?
    • @SeyedMortezaMousavi:您现在已经 三次 表示它不起作用,但尽管多次被问及更多信息,但您没有说什么不起作用.在您告诉我们如何它不起作用之前,您是否不明白我们无法为您提供帮助?
    • @AminM:正如我之前建议的,你应该问一个新问题。您的要求与此问题的要求不同。
    猜你喜欢
    • 2017-02-20
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 2020-09-10
    相关资源
    最近更新 更多