使用变量构建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)
{

然后由包含字段名列表的组合框的索引完成。

使用变量构建LinQ查询

如果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();