我有一个选择查询,它会反复使用不同的where
过滤器:
var query = from row in context.Table select row;
如何将其保存到静态类变量中,以便可以在不同的方法中重用它?像:
var results1 = query.Where(condition1);
...
var results2 = query.Where(condition2);
答案 0 :(得分:5)
你走在正确的轨道上。
考虑创建一个新方法而不是变量:
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();
答案 1 :(得分:3)
这样的事情:
Expression<Func<TypeYoureQueryingAgainst, bool>> query = p => p.Value == someValue; // etc..
然后您可以执行以下操作,其中TypeYoureQueryingAgainst位于存储库或您正在使用的任何模式中:
repository.Where(query);
希望有道理..
答案 2 :(得分:2)
此代码:
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);
答案 3 :(得分:1)
只需将var
替换为IEnumerable<RowType>
(或IQueryable<RowType>
),其中RowType
是结果序列中每个项目的(非匿名)类型:
static IEnumerable<RowType> query = from ... select row; // row is of RowType.
答案 4 :(得分:1)
嗯,第一步是找出query
的确切类型。最简单的方法是在调试器中使用它来逐步执行代码,并查看它所说的类型(可能是IQueryable<RowType>
或IOrderedQueryable<RowType>
)
答案 5 :(得分:0)
如果您的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");
}