无法在Repository类中创建非泛型LINQ函数

时间:2018-03-04 02:27:11

标签: c# linq repository

我正在尝试为对象Page创建存储库。

我想拥有非通用的LINQ查询,但似乎无法让它们正常工作,

如果它们是通用的并且在帮助程序类中,我只能创建它们。如果建议在Helper类中使用这种类型的函数,请告诉我,如果有,请告诉我原因。

public class PageRepository
{
    public PageViewModel GetPageById(string oid)
    {
        using (var db = new AppDbContext())
        {
            Page page = db.Pages
                //This is what I cannot get working
                .WhereStatusType(StatusType.Published);

            return GetPageView(page);
        }
    }

    //I would like the below to work
    //Tried generic (below), also non-generic <Page> but doesn't work
    internal static IQueryable<T> WhereStatusType<T>(this IQueryable<T> query, StatusType statusType = StatusType.Published)
        where T : Page
    {
        return query.Where(p => p.StatusType == statusType);
    }

}

//Below is working, but don't want it in a helper
public static class PageHelper
{
    internal static IQueryable<T> WhereStatusType<T>(this IQueryable<T> query, StatusType statusType = StatusType.Published)
        where T : Page
    {
        return query.Where(p => p.StatusType == statusType);
    }
}

当我尝试使IQueryable非泛型时,我收到以下错误:

  

公共类PageRepository有一个问题:

     

扩展方法必须在非泛型静态类中定义

此外:

  

'IQueryable'不包含'WhereStatusType'的定义,并且没有扩展方法'WhereStatusType'接受类型'IQueryable'的第一个参数可以找到(你是否缺少using指令或汇编引用?)

我确信这是一个简单的解决方案,谢谢你的帮助。此外,如果我接近这个错误,任何建议将不胜感激。

编辑:

虽然建议对上面的代码使用FirstOfDefault(),但我也希望在返回List<PageViewModel>时使用该函数(我可能过度简化了代码/示例),例如:

public List<PageViewModel> GetPages()
{
    using (var context = new AppDbContext())
    {

        List<Page> pages = new List<Page>();
        pages = context.Pages.AsNoTracking()
            .WhereStatusType(StatusType.Published)
            .ToList();

        if (pages != null)
        {
            List<PageViewModel> pageViewModels = new List<PageViewModel>();
            foreach (Page p in pages)
                pageViewModels.Add(GetPageView(p));

            return pageViewModels;
        }
        else
            return null;
    }
}

2 个答案:

答案 0 :(得分:1)

错误消息告诉您这里到底发生了什么。如果你想要一个扩展方法 - 一个第一个参数使用this关键字的方法,就像你的例子一样 - 那么它需要在非通用的静态类中定义,比如PageHelper

如果你不喜欢这种方法,你可以定义一个非扩展方法,如下所示:

public class PageRepository
{
    public PageViewModel GetPageById(string oid)
    {
        using (var db = new AppDbContext())
        {
            Page page = GetPagesWithStatus(db.Pages, StatusType.Published);

            return GetPageView(page);
        }
    }

    internal IQueryable<Page> GetPagesWithStatus(IQueryable<Page> query, StatusType statusType)
    {
        return query.Where(p => p.StatusType == statusType);
    }

}

答案 1 :(得分:0)

正如 @asherber 所提到的,您的LINQ查询并不正确。您正在将p.Aliasp.Alias进行比较

此外,您似乎想要FirstOrDefault()