我希望能够获取一个url格式的字符串(例如 united-kingdom ),并在WHERE子句中使用它来对抗未以这种方式格式化的Country列(例如英国)。
理想情况下,我希望能够做到这样的事情:
db.Jobs
.Where(j => j.Country.MyStringFormattingExtension() == urlformattedstring);
我知道这是不行的,因为EF会尝试在SQL端执行投影。它告诉我:“LINQ to Entities无法识别方法'System.String MyStringFormattingExtension(System.String)'方法,并且此方法无法转换为商店表达式。”
有人建议我在应用where子句之前将查询作为枚举返回,但我认为这样效率很低 - 在过滤之前从数据库中返回所有行。
答案 0 :(得分:1)
在查询中使用它之前,将URL格式的字符串转换为数据库格式怎么样呢?
var dbFormattedString = urlformattedstring.ConvertToDbFormat();
var result = db.Jobs.Where(j => j.Country == dbFormattedString);
(db.Jobs
已经是IEnumerable
了,所以我认为建议是在其上调用ToList()
- 它会起作用,但实际上,它效率非常低,除非桌很小。)
答案 1 :(得分:1)
您可以定义用户定义的函数并将其导入数据库。请阅读this article了解详情
// In SQL
CREATE FUNCTION dbo.ToFormattedString ...
// In C#
public static class EntityFunctions
{
[EdmFunction("dbo", "ToFormattedString")]
public static string ToFormattedString(this string input)
{
throw new NotSupportedException("Direct calls not supported");
}
}
var results = db.Jobs.Where(j => j.Country.ToFormattedString() == urlFormattedString);
或者,您可以在数据库中创建一个视图,该视图以您希望的格式化字符串,然后将其加入Linq查询。
// In SQL
CREATE VIEW dbo.vFormattedJobs AS ...
// In C#
var results =
(from j in db.vFormattedJobs
where j.FormattedCountry == urlFormattedString
select j);