【发布时间】:2012-09-03 08:16:16
【问题描述】:
我有一堆这些任务都基于 LINQ 查询。我正在寻找重构它们并使它们更易于阅读并允许我根据语言/地区等更改查询的好方法。
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());
我认为方便的一种方法是将查询拆分为类似的内容。
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);
这样我就可以做到这一点,而不必为每个区域重复整个查询。
if (MailLanguage == "English")
results = results.Where(p => p.MailLang== (int)MailLanguage.EU);
else
results = results.Where(p => p.MailLang== (int)MailLanguage.RU);
有没有人知道更好的解决方案?我最终拥有了巨大的功能,因为我需要根据要求执行大约 20 个这样的查询;例如地区、项目名称等。
编辑:
由于我不知道后端(网络服务/api)的一些限制,很遗憾我不能使用这个问题中提到的一些很棒的答案。
例如,这没有得到正确翻译,但绝不是因为答案不正确,根本无法与我正在使用的 API 一起工作——可能是因为它实现得很差。
public bool IsValid(Type x)
{
return (x.a == b) && (x.c ==d) && (x.d == e);
}
无论如何,任何寻找类似解决方案的人都是有效的答案,但最后我最终选择了与提供的解决方案类似的东西。
【问题讨论】:
-
为什么不用语言作为参数/变量?
-
欢迎进一步解释——我现在脑子里一片空白。请记住,可能有多种语言,例如英语可能是 US + EU。 :]
-
你查询的是数据库还是内存?
-
它是一个数据库。所以这些都是
IQueryable。
标签: c# linq refactoring