我是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是包含字符串的组合框。
问题是这只返回第一个匹配记录而不是所有其他匹配记录。
有什么建议吗?
答案 0 :(得分:4)
没有关于实际代码的更多详细信息。
IEnumerable
和IQueryable
可以轻松构建。
每个操作通常会返回另一个IEnumerable
或IQueryable
,因此您可以根据需要将它们链接起来。
以下是一个例子:
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;
}
答案 1 :(得分:0)
您没有提供组合框中存储的信息类型,以及您拥有的实体的类型集合。例如,默认情况下(当用户未选择任何值时),每个组合框的值具有值= 0(默认(int)),并且您的实体(让我们称之为Sample
)具有3个属性(int { {1}},字符串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);
== 50
Age
在某些数组中,所有实体都有var someArray = Filter(someArray, 50, "John", null);
== 50和Age
== John
等...