【问题标题】:Linq query from user input来自用户输入的 Linq 查询
【发布时间】:2015-07-08 03:02:59
【问题描述】:

我是 linq 新手,只是遇到了一个我不明白的用法。在 ADO .Net 中,SQL 语句是字符串。当用户的输入影响查询时,很容易根据用户选择的复选框或下拉列表为 SQL 构建字符串。

在我当前的应用程序中,我有三个不同的下拉框,用户可以在其中为他们的查询选择各种值。假设每个下拉菜单有 10 个值。很容易说为每个可能的组合单独的 linq 查询是不切实际的。

如果我知道用户在组合框中选择了一个值,那么我可以轻松地将其编码到 linq 查询中。但是如果用户没有选择一个值怎么办?

如何处理可能存在或不存在的选择条件?

谢谢


所以根据我写的输入;

private DataTable FilterDMRMarcIDs()
    {
        var tmpValue = dtDMRMarc.AsEnumerable();

        if (chekbCountry.Checked)
        {
            tmpValue = tmpValue.Where(contact => contact.Field<string>("Country") == cbCountry.SelectedItem);
        }
        if (chekbState.Checked){
            tmpValue = tmpValue.Where(contact => contact.Field<string>("State") == cbState.SelectedItem);
        }
        return tmpValue.CopyToDataTable<DataRow>();
    }    // FilterDMRMarcIDs() ...

其中 dtData 是一个数据表,cbCountry 和 cbState 是包含字符串的组合框。

问题是这仅返回第一个匹配记录,而不是所有其他匹配记录。

有什么建议吗?

【问题讨论】:

  • 在那种情况下会发生什么?

标签: c# .net linq


【解决方案1】:

没有关于您的实际代码的更多详细信息。

IEnumerableIQueryable 可以轻松构建。 每个操作通常会返回另一个IEnumerableIQueryable,因此您可以随意链接它们。

这是一个例子:

public IEnumerable<Value> GetValues(IEnumerable<Value> values, string filter1, string filter2, string filter3)
{
    if (filter1 != null)
        values = values.Where(v => v.Attribute1 == filter1)
    if (filter2 != null)
        values = values.Where(v => v.Attribute2 == filter2)
    if (filter3 != null)
        values = values.Where(v => v.Attribute3 == filter3)
    return values;
}

【讨论】:

  • 每个 values.where 语句是否相互叠加?因此,如果所有三个都具有非空值,那么总语句将等效于 Where (v.Attribute1 = filter1 and v.Attribute2 = filter2 and v.Attribute3 = filter3)?
【解决方案2】:

您没有提供您的组合框中存储了什么样的信息,以及您拥有什么样的实体集合。例如默认情况下(当用户没有选择任何值时),每个组合框的值都有值 = 0(默认(int)),你的实体(我们称之为Sample)有3个属性(int age ,字符串Name,字符串Surname)。然后你可以做类似的事情:

  public IEnumerable<Sample> Filter(IEnumerable<Sample> collectionToFilter, int age, string name, string surname){
     if(!age.Equals(default(age))){
        collectionToFilter = collectionToFilter.Where(e=>e.Age==age);
     }
     if(!string.IsNullOrEmpty(name)){
        collectionToFilter = collectionToFilter.Where(e=>e.Name==name);
     }
     if(!string.IsNullOrEmpty(surname)){
        collectionToFilter = collectionToFilter.Where(e=>e.Surname==surname);
     }
     return collectionToFilter;
  }

您处理任何组合框更改并调用Filter 方法。就是这样。 每个过滤器只有在设置为not default 值时才会应用。

例如,如果您将拨打下一个电话:

var someArray = Filter(someArray, 50, null, null);

在某些数组中将是所有具有Age == 50 的实体

var someArray = Filter(someArray, 50, "John", null);

在某些数组中将包含所有具有 Age == 50 和 Name == John 的实体

等等……

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多