使用变量构建LinQ查询
本文关键字:LinQ 查询 构建 变量 | 更新日期: 2023-09-27 18:05:34
我认为这是不可能的,但我想问一下,以确保。我目前正在调试一些软件别人写的,它有点未完成。
软件的一部分是搜索功能,它通过数据库中的不同字段进行搜索,编写该软件的人编写了一个包含21个case的大case语句,其中用户可能想要搜索的每个字段对应1个case。
是否有可能使用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();
更新/编辑:
这是在case语句之前的内容:
string searchField = txt1stSearchTerm.Text;
string searchColumn = cmbFirstColumn.Text;
switch (cmbFirstColumn.SelectedIndex + 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
的实例吗?或者它的基类的实例?
不同的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();