1

我希望能够采用 url 格式的字符串(例如 United -kingdom)并在 WHERE 子句中针对未以这种方式格式化的 Country 列(例如United Kingdom)使用它。

理想情况下,我希望能够做这样的事情:

db.Jobs
.Where(j => j.Country.MyStringFormattingExtension() == urlformattedstring);

我知道这是不行的,因为 EF 会尝试在 SQL 端执行投影。它给了我:“LINQ to Entities 无法识别 'System.String MyStringFormattingExtension(System.String)' 方法,并且该方法无法转换为存储表达式。”

有人建议我在应用 where 子句之前将查询作为可枚举返回,但是我认为这将非常低效 - 在过滤之前从数据库中返回所有行。

4

2 回答 2

1

换一种方式,在查询中使用 URL 格式的字符串之前将其转换为数据库格式怎么样?

var dbFormattedString = urlformattedstring.ConvertToDbFormat();
var result = db.Jobs.Where(j => j.Country == dbFormattedString);

(db.Jobs已经是IEnumerable,所以我认为建议是调用ToList()它 - 它会起作用,但实际上,除非表非常小,否则效率会非常低。)

于 2013-03-26T23:53:04.613 回答
1

您可以定义用户定义的函数并将其导入数据库。阅读本文了解更多详情

// 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);
于 2013-03-27T00:40:18.390 回答