繁体   English   中英

搜索功能LINQ。 使用复选框值作为参数

[英]Search function LINQ. Use checkbox values as parameters

我有一个搜索功能,可以显示7个参数,其中6个是复选框值。 它们像下面所示的布尔值。 我的日期时间搜索有问题。 如果用户选中该框,请运行一个Serach函数,其中数据库中的日期不为null。 目前,我的代码看起来像这样。 但是我想获得一些有关如何改进代码以获得更好的性能和代码结构的反馈。

public List<Invoice> GetAllInvoicesBySearch(int merchant, long buyer, bool send, bool paid, bool firstReminder, bool secondReminder, bool invoiceClaim)
    {
        var sendValue = new InvoiceStatus();
        var paidValue = new InvoiceStatus();
        var firstRemind = new DateTime();
        var secondRemind = new DateTime();
        if (buyer <= 0)
        {
            return null;
        }
        if (send)
        {
             sendValue = InvoiceStatus.Sent;
        }
        if (paid)
        {
            paidValue = InvoiceStatus.Paid;
        }
        if (firstReminder)
        {
            firstRemind = DateTime.Now;
        }
        if (secondReminder)
        {
            secondRemind = DateTime.Now;
        }

        return
            Context.Invoices.Where(
                i =>
                   i.InstallationId == merchant && i.Buyer.Msisdn == buyer || i.Status == sendValue || i.Status == paidValue ||
                    i.FirstReminderDate == firstRemind || i.SecondReminderDate == secondRemind).ToList();
    }

所以我的问题是现在正确的日期时间。 关于如何解决我的问题和改进我的代码的任何建议?

您最好使用PredicateBuilder并转换为如下扩展方法:

public static class ExtensionMethods {
    public static IQueryable<Invoice> Search(this IQueryable<Invoice> src, int merchant,
        long buyer, bool send, bool paid, bool firstReminder,
        bool secondReminder, bool invoiceClaim)
    {
        var predicate = PredicateBuilder.False<Invoice>();
        var sendValue = new InvoiceStatus();
        var paidValue = new InvoiceStatus();
        var firstRemind = new DateTime();
        var secondRemind = new DateTime();
        if (buyer <= 0)
        {
            return src.Where(predicate);
        }
        predicate=predicate.Or(i=>i.InstallationId == merchant && i.Buyer.Msisdn == buyer);
        if (send)
        {
             predicate=predicate.Or(i=>i.Status == InvoiceStatus.Sent);
        }
        if (paid)
        {
            predicate=predicate.Or(i=>i.Status == InvoiceStatus.Paid);
        }
        if (firstReminder)
        {
            predicate=predicate.Or(i=>i.FirstReminderDate == DateTime.Today);
        }
        if (secondReminder)
        {
            predicate=predicate.Or(i=>i.SecondReminderDate == DateTime.Today);
        }
        return src.Where(predicate);
    }
}

另外,如果我正确理解您的代码,则InvoiceStatus应该是一个枚举,或者至少应将InvoiceStatus.Sent和InvoiceStatus.Paid标记为静态。 像这样引用它:

Context.Invoices.Search(...).OrderBy(...)...

如果您需要进行除原始搜索之外的排序,分页和过滤操作,它将使进一步的操作变得更加容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM