我有一个查询语句,它会被不同的where
过滤器反复使用:
var query = from row in context.Table select row;
如何将此保存到静态类变量中,以便在不同的方法中重复使用?例如:
var results1 = query.Where(condition1);
...
var results2 = query.Where(condition2);
我有一个查询语句,它会被不同的where
过滤器反复使用:
var query = from row in context.Table select row;
如何将此保存到静态类变量中,以便在不同的方法中重复使用?例如:
var results1 = query.Where(condition1);
...
var results2 = query.Where(condition2);
你正在正确的道路上。
考虑创建一个新方法而不是一个变量:
public IQueryable<Cust> ListActiveCustomers()
{
return dataContext.Customers.Where(c=>c.IsActive==true);
}
//Active Customers with no invoices due.
var activePaidCustomers = ListActiveCustomers().Where(c=>c.InvoicesDue==0)
.OrderByDescending(c=>c.LastPaidOn)
.ToList();
像这样:
Expression<Func<TypeYoureQueryingAgainst, bool>> query = p => p.Value == someValue; // etc..
接下来你可以按照以下步骤操作,其中TypeYoureQueryingAgainst是指存储库或者其他你所使用的模式:
repository.Where(query);
var query = from row in context.Table select row;
功能上等同于:
var query = context.Table;
所以你不需要保留这个query
变量以便重复使用,直接使用context.Table
即可:
var results1 = context.Table.Where(condition1);
...
var results2 = context.Table.Where(condition2);
只需将var
替换为IEnumerable<RowType>
(或IQueryable<RowType>
),其中RowType
是结果序列中每个项目的(非匿名)类型:
static IEnumerable<RowType> query = from ... select row; // row is of RowType.
首先,找出query
的确切类型是第一步。最简单的方法是在调试器中逐步执行使用它的代码,并查看它所说的类型是什么(可能是IQueryable<RowType>
或IOrderedQueryable<RowType>
)。
如果您的where
筛选器是简单标量,则另一种选择是在数据库上下文的DbSet
属性上创建扩展方法。
如果您的DbContext
如下:
public class MyContext : DbContext
{
...
public DbSet<Customer> Customers { get;set; }
...
}
Customers
的 DbSet
上创建可重用的查询,例如:public static class MyDbContextExtension
{
public static IEnumerable<Customer> GetByName(this DbSet<Customer> customers, string name)
{
return customers.Where(c => c.Name.Contains(name));
}
}
然后像这样使用它:
var context = new MyContext();
var jedis = context.Customers.GetByName("skywalker");
if(jedis.Any())
{
logger.Log("These aren't the customers you're looking for");
}