如何从字符串创建 LINQ 查询?

Posted

技术标签:

【中文标题】如何从字符串创建 LINQ 查询?【英文标题】:How to create LINQ Query from string? 【发布时间】:2011-07-05 14:21:30 【问题描述】:

我是 LINQ 的新手,确实需要一些编码方面的帮助。

目前,我有一个字符串和一个 var 变量。

string temp = "from product in myEntities.Products where product.Name.Contains(_Name) select product";
var _Products = temp;
LvProducts.DataSource = _Products;
LvProducts.DataBind();

基本上,我想做的是能够通过预先将其分配到字符串中来创建自定义/复杂的 LINQ 查询。完成编写后,我将字符串分配给 var 变量。但是,这显然是行不通的。因此,任何人都可以在这方面帮助我吗?

【问题讨论】:

【参考方案1】:

你有几个选择:

使用Dynamic Linq 库来构建您的查询 苍蝇。最好的地方 开始阅读ScottGu's blog entry。不过,我不认为 这些库支持包含 您的示例中的方法。 Here 是 解释如何添加的博客文章 这种支持。

直接执行SQL语句。查看 Linq to Sql 或 Linq to Entities 的 MSDN 文档。

var _Products = myEntities.ExecuteStoreQuery<Product>
(@"SELECT * FROM Products WHERE [Name] In ('Item1', 'Item2')");

使用 Linq 的可组合行为。这可能不是最优雅的解决方案,但如果您没有太多选择,它会非常有效。您可以将查询构造成多个部分。

var _Products = from product in myEntities.Products
                select product

_Products = from product in _Products 
            where product.Name.Contains(_Name)
            select product

if FilterByPrice 
    _Products = from product in _Products 
                where product.Price > 100 
                select product

【讨论】:

【参考方案2】:

您可以通过在某些 c# 中使用 CodeDomProvider - Adding scripting functionality to .NET applications 编译此 Linq 来做到这一点 - 但这是一个非常重量级的解决方案。如果您想了解有关如何执行此操作的更多信息,请查看 LinqPad - http://www.linqpad.net - 作者邀请您使用反编译器看看它是如何工作的!

如果要求只是简单的 where 子句,则替代方法可能是使用 Dynamic Linq - 请参阅 Scott Gu 的帖子和 Microsoft 的示例代码 - http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

【讨论】:

【参考方案3】:

也许这可以帮助你 http://nlinq.codeplex.com/

BR。

【讨论】:

【参考方案4】:

您首先使用 LINQ 的大部分原因是为了获得编译器验证的查询,这将在编译时检测错误。这将破坏该目的,因为字符串将在运行时被解析。

根据您的需要,您有两种选择:

1) 进行 eSQL 查询并在 ObjectContext 上运行它。使用它,您仍然可以使用 myEntities.Products 等实体,并返回产品列表。

2) 使用普通 SQL 查询,并使用 ObjectContext 直接调用底层数据库。

【讨论】:

如果这只是 Linq to Objects 怎么办? (不是 EF,不是数据库后端) @Serge - 在这种情况下,他当然仍然可以使用 SQL 选项,但是 eSQL 选项在窗口之外;)【参考方案5】:

我的猜测是您将不得不使用动态代码执行。有关更多详细信息,请查看 west-wind 上的 Ricks 帖子。

【讨论】:

【参考方案6】:

您将其视为动态 SQL,您将语句创建为字符串并将其解析为 SQL 语句。

既然您已经在代码中,为什么不直接在其中编写语句。如果您使用 Lambda 而不是传统的 linq,会容易得多。我的 2 美分。

【讨论】:

以上是关于如何从字符串创建 LINQ 查询?的主要内容,如果未能解决你的问题,请参考以下文章

Linq 查询 - 根据第一个字母 b/w 两个范围查找字符串

linq 怎么转换日期为字符串

linq 怎么转换日期为字符串

从字符串构建动态LINQ查询 - 使用Reflection?

如何使用 LINQ 查询? [关闭]

如何简化在字符串中搜索关键字并按相关性排序的 LINQ 查询?