我已经实现了一个搜索查询。它取代了“正常化”的特殊字符。我已在不同的领域应用此规则。事实上,查询看起来非常丑陋,并且充满了DRY违规。重构LINQ to Entities查询
但反驳这一点,似乎并不是一件容易的事(对我来说)。当然,我只是想对整个替换 - 东西重构为一个单独的方法,但是这导致像
LINQ到实体错误不承认 方法“System.String 帮助(System.String )”的方法,而这种方法 不能转换成 店expressio ...
下面的代码显示了查询的一部分,还有更多的语句是这样的吧。如果有人有想法,为了让这个更好,这将是非常棒的!
qry = qry.Where(guest =>
(guest.FirstName
.Replace("ü", "u").Replace("ue", "u").Replace("û", "u").Replace("ù", "u").Replace("ú", "u")
.Replace("ä", "a").Replace("ae", "a").Replace("â", "a").Replace("à", "a").Replace("á", "a")
.Replace("ë", "e").Replace("ê", "e").Replace("è", "e").Replace("é", "e")
.Replace("ö", "o").Replace("oe", "o").Replace("ô", "o").Replace("ò", "o").Replace("ó", "o")
.Replace("ï", "i").Replace("ì", "i").Replace("ì", "i").Replace("í", "i")
.Replace("ç", "c")
.Replace(".", "").Replace("-", "").Replace("_", "").Replace("´", "").Replace("'", "").Replace("\"", "")
.Replace("(", "").Replace(")", "").Replace("[", "").Replace("]", "").Replace("{", "").Replace("}", "")
.Replace("$", "").Replace("+", "").Replace("*", "").Replace("@", "")
.Replace("|", "").Replace("\\", "").Replace("/", "").Replace("<", "").Replace(">", "")
.Replace(".", "").Replace(",", "").Replace(";", "").Replace(":", "")
.Replace("=", "").Replace("%", "").Replace("^", "").Replace("?", "").Replace("!", "")
.StartsWith(firstName)
&& (guest.LastName
.Replace("ü", "u").Replace("ue", "u").Replace("û", "u").Replace("ù", "u").Replace("ú", "u")
.Replace("ä", "a").Replace("ae", "a").Replace("â", "a").Replace("à", "a").Replace("á", "a")
.Replace("ë", "e").Replace("ê", "e").Replace("è", "e").Replace("é", "e")
.Replace("ö", "o").Replace("oe", "o").Replace("ô", "o").Replace("ò", "o").Replace("ó", "o")
.Replace("ï", "i").Replace("ì", "i").Replace("ì", "i").Replace("í", "i")
.Replace("ç", "c")
.Replace(".", "").Replace("-", "").Replace("_", "").Replace("´", "").Replace("'", "").Replace("\"", "")
.Replace("(", "").Replace(")", "").Replace("[", "").Replace("]", "").Replace("{", "").Replace("}", "")
.Replace("$", "").Replace("+", "").Replace("*", "").Replace("@", "")
.Replace("|", "").Replace("\\", "").Replace("/", "").Replace("<", "").Replace(">", "")
.Replace(".", "").Replace(",", "").Replace(";", "").Replace(":", "")
.Replace("=", "").Replace("%", "").Replace("^", "").Replace("?", "").Replace("!", "")
.StartsWith(lastName)
||
guest.LastName
.Replace("ü", "u").Replace("ue", "u").Replace("û", "u").Replace("ù", "u").Replace("ú", "u")
.Replace("ä", "a").Replace("ae", "a").Replace("â", "a").Replace("à", "a").Replace("á", "a")
.Replace("ë", "e").Replace("ê", "e").Replace("è", "e").Replace("é", "e")
.Replace("ö", "o").Replace("oe", "o").Replace("ô", "o").Replace("ò", "o").Replace("ó", "o")
.Replace("ï", "i").Replace("ì", "i").Replace("ì", "i").Replace("í", "i")
.Replace("ç", "c")
.Replace(".", "").Replace("-", "").Replace("_", "").Replace("´", "").Replace("'", "").Replace("\"", "")
.Replace("(", "").Replace(")", "").Replace("[", "").Replace("]", "").Replace("{", "").Replace("}", "")
.Replace("$", "").Replace("+", "").Replace("*", "").Replace("@", "")
.Replace("|", "").Replace("\\", "").Replace("/", "").Replace("<", "").Replace(">", "")
.Replace(".", "").Replace(",", "").Replace(";", "").Replace(":", "")
.Replace("=", "").Replace("%", "").Replace("^", "").Replace("?", "").Replace("!", "")
.Contains(" " + lastName)
||
guest.LastName.Replace(" ", "")
.Replace("ü", "u").Replace("ue", "u").Replace("û", "u").Replace("ù", "u").Replace("ú", "u")
.Replace("ä", "a").Replace("ae", "a").Replace("â", "a").Replace("à", "a").Replace("á", "a")
.Replace("ë", "e").Replace("ê", "e").Replace("è", "e").Replace("é", "e")
.Replace("ö", "o").Replace("oe", "o").Replace("ô", "o").Replace("ò", "o").Replace("ó", "o")
.Replace("ï", "i").Replace("ì", "i").Replace("ì", "i").Replace("í", "i")
.Replace("ç", "c")
.Replace(".", "").Replace("-", "").Replace("_", "").Replace("´", "").Replace("'", "").Replace("\"", "")
.Replace("(", "").Replace(")", "").Replace("[", "").Replace("]", "").Replace("{", "").Replace("}", "")
.Replace("$", "").Replace("+", "").Replace("*", "").Replace("@", "")
.Replace("|", "").Replace("\\", "").Replace("/", "").Replace("<", "").Replace(">", "")
.Replace(".", "").Replace(",", "").Replace(";", "").Replace(":", "")
.Replace("=", "").Replace("%", "").Replace("^", "").Replace("?", "").Replace("!", "")
.StartsWith(lastName))
) || (
guest.FirstName
.Replace("ü", "u").Replace("ue", "u").Replace("û", "u").Replace("ù", "u").Replace("ú", "u")
.Replace("ä", "a").Replace("ae", "a").Replace("â", "a").Replace("à", "a").Replace("á", "a")
.Replace("ë", "e").Replace("ê", "e").Replace("è", "e").Replace("é", "e")
.Replace("ö", "o").Replace("oe", "o").Replace("ô", "o").Replace("ò", "o").Replace("ó", "o")
.Replace("ï", "i").Replace("ì", "i").Replace("ì", "i").Replace("í", "i")
.Replace("ç", "c")
.StartsWith(lastName)
&& (guest.LastName
.Replace("ü", "u").Replace("ue", "u").Replace("û", "u").Replace("ù", "u").Replace("ú", "u")
.Replace("ä", "a").Replace("ae", "a").Replace("â", "a").Replace("à", "a").Replace("á", "a")
.Replace("ë", "e").Replace("ê", "e").Replace("è", "e").Replace("é", "e")
.Replace("ö", "o").Replace("oe", "o").Replace("ô", "o").Replace("ò", "o").Replace("ó", "o")
.Replace("ï", "i").Replace("ì", "i").Replace("ì", "i").Replace("í", "i")
.Replace("ç", "c")
.Replace(".", "").Replace("-", "").Replace("_", "").Replace("´", "").Replace("'", "").Replace("\"", "")
.Replace("(", "").Replace(")", "").Replace("[", "").Replace("]", "").Replace("{", "").Replace("}", "")
.Replace("$", "").Replace("+", "").Replace("*", "").Replace("@", "")
.Replace("|", "").Replace("\\", "").Replace("/", "").Replace("<", "").Replace(">", "")
.Replace(".", "").Replace(",", "").Replace(";", "").Replace(":", "")
.Replace("=", "").Replace("%", "").Replace("^", "").Replace("?", "").Replace("!", "")
.StartsWith(firstName)
||
guest.LastName
.Replace("ü", "u").Replace("ue", "u").Replace("û", "u").Replace("ù", "u").Replace("ú", "u")
.Replace("ä", "a").Replace("ae", "a").Replace("â", "a").Replace("à", "a").Replace("á", "a")
.Replace("ë", "e").Replace("ê", "e").Replace("è", "e").Replace("é", "e")
.Replace("ö", "o").Replace("oe", "o").Replace("ô", "o").Replace("ò", "o").Replace("ó", "o")
.Replace("ï", "i").Replace("ì", "i").Replace("ì", "i").Replace("í", "i")
.Replace("ç", "c")
.Replace(".", "").Replace("-", "").Replace("_", "").Replace("´", "").Replace("'", "").Replace("\"", "")
.Replace("(", "").Replace(")", "").Replace("[", "").Replace("]", "").Replace("{", "").Replace("}", "")
.Replace("$", "").Replace("+", "").Replace("*", "").Replace("@", "")
.Replace("|", "").Replace("\\", "").Replace("/", "").Replace("<", "").Replace(">", "")
.Replace(".", "").Replace(",", "").Replace(";", "").Replace(":", "")
.Replace("=", "").Replace("%", "").Replace("^", "").Replace("?", "").Replace("!", "")
.Contains(" " + firstName)
||
guest.LastName.Replace(" ", "")
.Replace("ü", "u").Replace("ue", "u").Replace("û", "u").Replace("ù", "u").Replace("ú", "u")
.Replace("ä", "a").Replace("ae", "a").Replace("â", "a").Replace("à", "a").Replace("á", "a")
.Replace("ë", "e").Replace("ê", "e").Replace("è", "e").Replace("é", "e")
.Replace("ö", "o").Replace("oe", "o").Replace("ô", "o").Replace("ò", "o").Replace("ó", "o")
.Replace("ï", "i").Replace("ì", "i").Replace("ì", "i").Replace("í", "i")
.Replace("ç", "c")
.Replace(".", "").Replace("-", "").Replace("_", "").Replace("´", "").Replace("'", "").Replace("\"", "")
.Replace("(", "").Replace(")", "").Replace("[", "").Replace("]", "").Replace("{", "").Replace("}", "")
.Replace("$", "").Replace("+", "").Replace("*", "").Replace("@", "")
.Replace("|", "").Replace("\\", "").Replace("/", "").Replace("<", "").Replace(">", "")
.Replace(".", "").Replace(",", "").Replace(";", "").Replace(":", "")
.Replace("=", "").Replace("%", "").Replace("^", "").Replace("?", "").Replace("!", "")
.StartsWith(firstName))
));
哇,你为我做了很多工作:-)非常感谢,这给了我一个好主意(或几乎解决方案)来重构我的需求。 – Daniel 2010-09-25 23:10:14
不客气! :-)我使用LINQ到EF和LINQ到SQL很多,发现这个问题很有趣。我以前没有想到将表达式树结合起来,但现在我认为它将被证明对于未来的工作非常有用。 – 2010-09-26 10:08:02
对不起,我以前无法尝试你的代码。您是否已成功将该代码与LINQ to Entities运行?我得到一个异常:LINQ表达式节点类型'Invoke'在LINQ to Entities中不受支持:-( – Daniel 2010-10-01 12:05:33