使用LINQ的多个搜索参数

jne*_*son 8 c# linq-to-sql

我写的是我认为应该是一个相对直接的Windows窗体应用程序.我正在使用LINQ to SQL,尽管我之前从未使用过它.我们有一个SQL Server数据库,我正在创建一个访问该数据库的前端.我正试图找出用它搜索多个(任意数量)搜索参数的最有效方法.

在windows窗体中,我创建了一个字典,其中包含每个搜索键及其要搜索的值,并将其传递给我的search()方法.我试图找到一种方法来搜索数据库中的每个键及其相关值.这是我想要做的:

public IQueryable<Product> Search(Dictionary<string, string> searchParams)
{
   DBDataContext dc = new DBDataContext();
   var query = dc.Products;

   foreach (KeyValuePair<string, string> temp in searchParams)
   {
      query = query.Where(x => x.(temp.Key) == temp.Value);
   }

   return query;
}
Run Code Online (Sandbox Code Playgroud)

我意识到语法x.(temp.Key)是不正确的,但我希望这说明了我想要做的事情.我想知道是否有另一种方法去做我想做的事情,而不必做一个巨大的switch语句(或if if else if tree).

编辑

所以,我稍微修改了一下,但我仍然遇到问题.这是我目前拥有的:

public IQueryable<Product> Search(Dictionary<string, string> searchParams)
{
    DBDataContext dc = new DBDataContext();

    string sQuery = "";
    foreach (KeyValuePair<string, string> temp in searchParams)
    {
        sQuery += temp.Key + "=" + temp.Value + " AND ";
    }

    var query = dc.Products.Where(sQuery);

    return query;
}
Run Code Online (Sandbox Code Playgroud)

根据LINQ Dynamic Query Library的文章,这应该没问题.这是我得到的错误:

无法从用法中推断出方法'System.Linq.Queryable.Where(System.Linq.IQueryable,System.Linq.Expressions.Expression>)'的类型参数.尝试显式指定类型参数.

Kev*_*son 2

如果由于某种原因不需要字典,我会将您的搜索方法设置如下:

public IQueryable<Product> Search( Func<Product, bool> isMatch )
{
   DBDataContext dc = new DBDataContext();
   return dc.Products.Where( isMatch ).AsQueryable();
}
Run Code Online (Sandbox Code Playgroud)

然后,您将使用如下方法:

Obj.Search( item => item.Property1 == "Hello" && item.Property2 == "World" );
Run Code Online (Sandbox Code Playgroud)

有什么理由让你不能这样做吗?

[编辑:添加了 AsQueryable()]

[编辑:使用字符串的动态查询]

看看这里,看看这是否有帮助。我没有使用过它,但看起来这就是您正在寻找的: http ://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the- linq-动态-查询-library.aspx

就我个人而言,我通常更喜欢类型安全的 Expression> 方法,因为这会给您编译时错误......但如果需要字符串,那么看起来是最好的方法。

根据上面的链接,看起来您应该能够执行以下操作:

query = query.Where( String.Format("{0}={1}",dict.Key,dict.Value) );
Run Code Online (Sandbox Code Playgroud)

[编辑:字符串构建示例]

所以,问题之一是你的 sql 查询将以字符串末尾的 AND 结尾,但后面没有条件...所以,可能会尝试更改为这个...语法可能会略有偏差,但是应该是正确的:

public IQueryable<Product> Search(Dictionary<string, string> searchParams)
{
    DBDataContext dc = new DBDataContext();

    StringBuilder sQuery = new StringBuilder();
    foreach (KeyValuePair<string, string> temp in searchParams)
    {
        if( sQuery.Length > 0 ) sQuery.Append(" AND ");
        sQuery.AppendFormat("{0}={1}",temp.Key,temp.Value);
    }

    var query = dc.Products.Where(sQuery.ToString());

    return query;
}
Run Code Online (Sandbox Code Playgroud)

这只会在第一个之后的条件上使用“AND”。希望能帮助到你...

仅供参考 - 这是题外话,但是我使用 StringBuilder 的原因是字符串连接方式会导致字符串被破坏,并且每个循环在内存中创建一个新字符串 4 次...所以更改为 StringBuilder因为这将创建一个可以填充的缓冲区,并且仅在必要时调整大小。