使用变量构建LinQ查询?

时间:2014-05-28 07:25:12

标签: c# sql linq

我认为不可能,但想要确认。我正在调试其他人写的软件,有点未完成。

软件的一部分是搜索功能,它按数据库中的不同字段进行搜索,编写软件的人写了一个很大的案例陈述,其中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)
{

然后通过组合框的索引完成这些案例,该组合框包含字段名称列表。

2 个答案:

答案 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();