按实体查询(示例)

时间:2009-03-24 16:27:40

标签: c# linq entity-framework

我正在寻找一种工具,可以动态生成来自给定实体的Linq to Entity查询,按实体查询(示例),如果愿意的话。给定一个实体及其所属的对象上下文,生成器返回可以进一步修改或执行的ObectQuery或IQueryable。理想情况下,查询构建器不会直接引用实体模型,而是使用对象上下文从模型构建查询。我想代码看起来像这样:

        QueryBuilder qb = new QueryBuilder(new EntitiesContext());
        Customer c = new Customer();
        qb.Add(c);  
        c.FirstName = "Jim";
        var qry = qb.BuildQuery();
        int total = qry.Count();

基础查询看起来像这样:

var query = from c in ctx.Customers
            where c.FirstName == "Jim"
            select c;

这样的事情已经存在吗?我可以想象自己编写这样的东西,但我宁愿开始使用已存在的东西。

3 个答案:

答案 0 :(得分:2)

我不确定您的目标是什么,如果您要发布有关您的上下文的更多信息(实际问题),但Dynamic Linq可能会帮助您动态构建linq查询:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

韦博

答案 1 :(得分:1)

我没有真正看到QueryBuilder中的值。如果它像您的样本一样简单,您只能使用它来查找完全匹配。如果您需要更复杂的查询,您可能最好直接使用Linq。

你知道你可以链接你的查询吗?这可能不是你想要的,但你可以做到

IQueryable<Customers> source=context.Customers;

if (...)
{
  source = from c in source
           where c.FirstName.StartsWith("Jim")
           select c;
}

if (...)
{
  source = from c in source
           where contries.Contains(c.Country)
           select c;
}

// ...

答案 2 :(得分:1)

您可以使用动态Linq在运行时构建Linq表达式 - 只需将方法附加到现有Linq查询(在执行之前)。 话虽如此,正如Chris提到的那样,“QueryBuilder”类的概念具有可疑的优点。

严格来说,Linq本身就是一个查询构建器,因为它接受一个Linq语句并构造一个“图形”,然后查询提供程序可以用它来执行底层工作(为Linq-To-SQL编译SQL语句) ,或枚举Linq-For-Objects的对象)。 如果您希望为最终用户提供动态构建查询的能力,请考虑通过添加像Chris指出的查询方法来创建构建Linq语句的UI。请记住,使用Linq查询,您可以添加任意数量的表达式 - 查询仅在枚举器被触发时执行。

即。要选择名为Jim的65岁以下最老的客户:

Dim qry = From customer in DataContext.Customers
qry = qry.Where( Function (c as Customer) c.Name="Jim" )
qry = qry.Where( Function (c as Customer) c.Age < 65 )
qry = qry.OrderByDescending( Function (c as Customer) c.Age )
qry = qry.Take(1) 
Dim oldJim as Customer = qry.FirstOrDefault()

FirstOrDefault方法,如使用ToArray或For Each,会使枚举器跳闸,从而处理查询。

希望这有帮助!