劈裂为改进可维护性长LINQ查询 [英] Spliting up long linq queries for improved maintainability

查看:106
本文介绍了劈裂为改进可维护性长LINQ查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一堆这些任务都是基于LINQ查询。我正在寻找好的方法重构他们,让他们更容易阅读,并让我改变取决于语言/区域等查询。

I have a bunch of these Tasks that are all based on LINQ queries. I am looking for good way to refactor them and make them easier to read and allow me to change the queries depending on language/region etc.

var mailTaskOne = CreateTask(() => myService.Mail.Where(p => p.ProjectName == "Delta"
    && (p.MailLang== (int)MailLanguage.EU || p.MailLang == (int)MailLanguage.RU)
    && (p.DateEntered >= startDate && p.DateEntered <= endDate)
    && p.MailPriority == (int)MailPriority.High).Count());



一个我认为很方便将达到分裂查询弄成这样的方式。

One of the ways I thought would be convenient would be to split the query up into something like this.

var results = myService.Mail.Where(x => x.ProjectName == "Delta");
results = results.Where(p => p.MailLang== (int)MailLanguage.EU);
results = results.Where(p => p.DateModified >= startDate && p.DateModified <= endDate);

这将允许我这样做,而不必重复每个地区的整个查询。

This would allow me to do this without having to repeat the whole query for each region.

if (MailLanguage == "English")
    results = results.Where(p => p.MailLang== (int)MailLanguage.EU);
else
    results = results.Where(p => p.MailLang== (int)MailLanguage.RU);



是否有任何人知道这更好的解决办法?我最终巨大的功能,我需要做根据要求这些查询的也许20; 。如地区,项目名称等。

Is there anyone that knows a better solution for this? I end up having huge functions as I need to do maybe 20 of these queries depending on the requirements; such as Region, Project name etc.

编辑:

由于一些限制,我不知道与后端(Web服务/ API),我可以遗憾的是没有使用一些在这个问题中提及的真棒答案。

Due to some limitations I did not know of with the back-end (web service/api) I could unfortunately not use some of the awesome answers mentioned in this question.

例如这并没有正确翻译,但没办法,因为答案不正确,根本不与我反对工作API的工作 - 可能是因为它是执行不力。

For example this does not get translated properly, but in no ways because the answer incorrect, simply does not work with the API I am working against -- possibly because it is poorly implemented.

public bool IsValid(Type x)
{
    return (x.a == b) && (x.c ==d) && (x.d == e);
}



反正任何人寻找类似的解决方案所有这些都是有效的答案,但在。最后,我结束了与类似提供的解决方案snurre一些事情。

Anyway, anyone looking for similar solutions all of these are valid answers, but in the end I ended up going with something similar to the solution snurre provided.

推荐答案

您可以创建一个参数类,如:

You could create a parameter class like:

public class MailParameters
{
    public DateTime EndTime { get; private set; }
    public IEnumerable<int> Languages { get; private set; }
    public int Priority { get; private set; }
    public string ProjectName { get; private set; }
    public DateTime StartTime { get; private set; }

    public MailParameters(string projectName, DateTime startTime, DateTime endTime, MailLang language, Priority priority)
        : this(projectName, startTime, endTime, new[] { language }, priority)

    public MailParameters(string projectName, DateTime startTime, DateTime endTime, IEnumerable<MailLang> languages, Priority priority)
    {
        ProjectName = projectName;
        StartTime = startTime;
        EndTime = endTime;
        Languages = languages.Cast<int>();
        Priority = (int)priority;
    }
}

然后添加这些扩展方法:

Then add these extension methods:

public static int Count(this IQueryable<Mail> mails, MailCountParameter p)
{
    return mails.Count(m =>
        m.ProjectName == p.ProjectName &&
        p.Languages.Contains(m.MailLang) &&
        m.EnteredBetween(p.StartTime, p.EndTime) &&
        m.Priority == p.Priority);
}

public static bool EnteredBetween(this Mail mail, DateTime startTime, DateTime endTime)
{
    return mail.DateEntered >= startTime && mail.DateEntered <= endTime;
}



用法然后将:

The usage would then be:

var mailParametersOne = new MailParameters("Delta", startDate, endDate, new[] { MailLang.EU, MailLang.RU }, MailPriority.High);
var mailTaskOne = CreateTask(() => myService.Mail.Count(mailParametersOne));

这篇关于劈裂为改进可维护性长LINQ查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆