我认为不可能,但想要确认。我正在调试其他人写的软件,有点未完成。
软件的一部分是搜索功能,它按数据库中的不同字段进行搜索,编写软件的人写了一个很大的案例陈述,其中21个案例用于用户可能想要搜索的每个字段。
是否可以使用Linq中的case语句或我可以在Linq语句之前使用case语句设置的变量来减少这种情况?
Linq查询之一的示例:(仅每个查询中的Where更改)
var list = (from data in dc.MemberDetails
where data.JoinDate.ToString() == searchField
select new
{
data.MemberID,
data.FirstName,
data.Surname,
data.Street,
data.City,
data.County,
data.Postcode,
data.MembershipCategory,
data.Paid,
data.ToPay
}
).ToList();
更新/编辑:
这是案例陈述之前的内容:
string searchField = txt1stSearchTerm.Text;
string searchColumn = cmbFirstColumn.Text;
switch (cmbFirstColumn.SelectedIndex + 1)
{
然后通过组合框的索引完成这些案例,该组合框包含字段名称列表。
答案 0 :(得分:1)
鉴于where
接受谓词,您可以传递任何以MemberDetail
作为参数并返回布尔值的方法或函数,然后将switch语句迁移到其中。
private bool IsMatch(MemberDetail detail)
{
// The comparison goes here.
}
var list = (from data in dc.MemberDetails
where data => this.IsMatch(data)
select new
{
data.MemberID,
data.FirstName,
data.Surname,
data.Street,
data.City,
data.County,
data.Postcode,
data.MembershipCategory,
data.Paid,
data.ToPay
}
).ToList();
请注意:
您可能会寻找一种更面向对象的方式来进行比较,而不是使用巨大的开关块。
您在select
中使用的具有十个属性的匿名类型有点奇怪。您无法返回MemberDetail
的实例吗?或者它的基类的实例?
答案 1 :(得分:1)
如何处理不同的where语句,它们是相互排斥还是以某种方式限制查询?
以下是如何为同一个查询设置一个或多个过滤器,并在应用所有过滤器后实现的。
var query = (from data in dc.MemberDetails
select ....);
if (!String.IsNullOrEmpty(searchField))
query = query.Where(pr => pr.JoinDate.ToString() == searchField);
if (!String.IsNullOrEmpty(otherField))
query = query.Where(....);
return query.ToList();