从可以与任何东西相等的列中进行选择

时间:2014-04-28 00:38:19

标签: c# mysql asp.net sql

这是我目前的代码

SELECT * FROM [Products] WHERE CategoryID=@category

我正在使用ASP.net和c#,我从page1设置会话然后重定向到page2然后将此会话用作类别。问题是我希望当会话为null时(即如果你直接进入页面,而不是第1页的重定向),代码就像下面那样工作

SELECT * FROM [Products] WHERE CategoryID= anything

所以我的所有产品都出现了,而不仅仅是特定类别的产品。 无论如何我能做到吗?

感谢。

3 个答案:

答案 0 :(得分:1)

如果设置了@category,请运行查询。如果没有,运行这个:

  

SELECT * FROM Products

答案 1 :(得分:0)

您需要一个不同的查询,一个完全省略CategoryID= whatever的查询,以执行您要执行的操作。这很容易编程。

答案 2 :(得分:0)

不,您可以传递的值不会将=转换为<>。您必须为此使用不同的查询,要么是一段不同的代码,要么是根据需求构建的查询。

就个人而言,我简单地使用LINQ:

var qry = context.products.AsQueryable();
if (!string.IsNullOrEmpty(session))
    qry = qry.Where(p => p.CategoryID == session);

您可以继续添加这样的术语,然后在最后执行查询以获得结果。

您可以通过将查询创建为字符串和参数集合来获得类似的灵活性:

var qstr = "SELECT * FROM Products";
var parms = new Dictionary<string, object>();

if (!string.IsNullOrEmpty(session))
{
    qstr += " WHERE CategoryID = @category";
    parms["category"] = session;
}

using (var cmd = connection.CreateCommand())
{
    cmd.CommandType  = CommandType.Text;
    cmd.CommandText = qstr;

    foreach (var parm in parms)
        cmd.Parameters.AddWithValue("@" + parm.Key, parm.Value);

    using (var reader = cmd.ExecuteReader())
    {
        //....
    }   
}

如果您需要多个表单,则可以添加一些逻辑来构建条件列表。小心你如何将它们拼接在一起。

更喜欢较短的LINQ解决方案:P