创建可重用的Linq查询

时间:2010-08-19 13:54:00

标签: c# entity-framework linq linq-to-entities

我有一个选择查询,它会反复使用不同的where过滤器:

var query = from row in context.Table select row;

如何将其保存到静态类变量中,以便可以在不同的方法中重用它?像:

var results1 = query.Where(condition1);
...
var results2 = query.Where(condition2);

6 个答案:

答案 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");
}