13

我是 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 变量。但是,这显然是行不通的。因此,任何人都可以帮助我吗?

4

6 回答 6

21

你有几个选择:

  • 使用Dynamic Linq 库即时构建您的查询。最好的入门方法是阅读ScottGu 的博客条目。但是,我认为这些库不支持您示例中的 contains 方法。是一篇博客文章,解释了如何添加此支持。

  • 直接执行 SQL语句。查看有关Linq to SqlLinq 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
    }
    
于 2011-02-28T09:22:57.707 回答
8

您可以通过在某些 c# 中使用 CodeDomProvider(向 .NET 应用程序添加脚本功能)编译此 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

于 2011-02-28T08:05:21.070 回答
3

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

BR。

于 2011-02-28T10:20:08.017 回答
0

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

于 2011-02-28T08:11:12.350 回答
0

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

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

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

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

于 2011-02-28T08:06:46.317 回答
-3

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

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

于 2011-02-28T08:04:55.550 回答