我正在尝试从众多下拉列表中获取值,并根据所选的选项构建where语句。如果他们没有被选中,那么他们应该被排除在选择陈述之外。
我就是这样做的,但我认为用linq不能这样做。
IEnumerable<IGrouping<string, Forest>> treeQuery =
from trees in Forest
if (ddlType1.SelectedValue!=null)
{
string strWhere += trees.Type1 == ddlType1.SelectedValue
}
else if (ddlType2.SelectedValue!=null)
{
string strWhere += trees.Type2 == ddlType2.SelectedValue
}
where strWhere
orderby trees.Nuts
group trees by trees.TrunkColour;
非常感谢任何帮助。
这是我在...中添加示例之前的代码。
IEnumerable<IGrouping<string, Forest>> treeQuery =
from trees in Forest
where trees.Type1 == "oak"
orderby trees.Nuts
group trees by trees.TrunkColour;
答案 0 :(得分:8)
在这种情况下,您可以使用查询的组合性质,但您不想使用查询表达式。所以:
// Or IEnumerable<Forest>, depending on the type involved...
IQueryable<Forest> query = Forest;
if (ddlType1.SelectedValue!=null)
{
query = query.Where(trees => trees.Type1 == ddlType1.SelectedValue);
}
else if (ddlType2.SelectedValue!=null)
{
query = query.Where(trees => trees.Type2 == ddlType2.SelectedValue);
}
var finalQuery = query.OrderBy(trees => tree.Nuts)
.GroupBy(trees => trees.TrunkColour);
在您开始使用结果之前,这实际上不会执行查询 - 因此您可以逐位添加过滤,排序等,直到您“准备好”为止。
答案 1 :(得分:2)
对于每个下拉列表,您可以在您的位置添加一个子句:
where (ddlType1.SelectedValue == "" || trees.Type1 == ddlType1.SelectedValue)
&& (ddlType2.SelectedValue == "" || trees.Type2 == ddlType2.SelectedValue)
// && ( type 3... )
答案 2 :(得分:1)
由于这只涉及两个条件,您可以在单个LINQ查询中执行此操作:
Forest.Where(tree =>
(
(ddlType1.SelectedValue == null || tree.Type1 == ddlType1.SelectedValue) &&
(ddlType2.SelectedValue == null || tree.Type2 == ddlType2.SelectedValue)
))
.OrderBy(tree => tree.Nuts)
.GroupBy(tree => tree.TrunkColour);
虽然随着条件数量的增加,值得将查询拆分成单独的部分以提高可读性,因为这种格式可能会因多个变量而无法快速读取。