我正在尝试为对象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;
}
}
答案 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.Alias
与p.Alias
进行比较
此外,您似乎想要FirstOrDefault()
。