【发布时间】:2014-10-26 18:32:54
【问题描述】:
我正在尝试整合使用实体框架访问不同表的逻辑。我创建了一个扩展方法,用于从该人参加的注册实体中提取所有注册:
public static IEnumerable<Registration> Attending(this IEnumerable<Registration> registrations)
{
return registrations.Where(r => r.Status == RegistrationStatus.Paid || r.Status == RegistrationStatus.Assigned || r.Status == RegistrationStatus.Completed);
}
这非常适合这样的查询:
var attendees = db.Registrations.Attending().ToList();
但在子查询中使用时不起作用:
ProductTotals = db.Products.Where(p => p.EventID == ev.Id).Select(p => new ProductSummaryViewModel
{
ProductID = p.ProductID,
ProductName = p.Name,
Registrations = p.Registrations.Attending().Count(),
}).ToList();
我收到以下错误:
LINQ to Entities 无法识别该方法 'System.Collections.Generic.IEnumerable
1[Registration] Attending(System.Collections.Generic.IEnumerable1[注册])' 方法,并且该方法不能翻译成商店表达式。
有没有办法在子查询中重用该代码?
【问题讨论】:
-
您可以在
Select之前使用AsEnumerable()来执行内存中的操作。尽管您失去了在数据库级别执行它的优势。 -
如果您在 EF 查询中使用该方法,则该方法应该接受并返回
IQueryable而不是IEnumerable,否则不会在数据库上执行查询。 -
@Servy 谢谢,我注意到了同样的事情并将其更改为使用 IQueryable
标签: c# sql-server asp.net-mvc linq entity-framework