Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在与where子句进行比较之前,是否可以格式化DB内容(作为字符串)_C#_Linq_Formatting_Where - Fatal编程技术网

C# 在与where子句进行比较之前,是否可以格式化DB内容(作为字符串)

C# 在与where子句进行比较之前,是否可以格式化DB内容(作为字符串),c#,linq,formatting,where,C#,Linq,Formatting,Where,我希望能够获取一个url格式的字符串(例如英国),并在WHERE子句中对未按这种方式格式化的国家/地区列(例如英国)使用它 理想情况下,我希望能够做到以下几点: db.Jobs .Where(j => j.Country.MyStringFormattingExtension() == urlformattedstring); 我知道这是不可能的,因为EF会尝试在SQL端执行投影。它告诉我:“LINQ to Entities无法识别方法'System.String MyStringFor

我希望能够获取一个url格式的字符串(例如英国),并在WHERE子句中对未按这种方式格式化的国家/地区列(例如英国)使用它

理想情况下,我希望能够做到以下几点:

db.Jobs
.Where(j => j.Country.MyStringFormattingExtension() == urlformattedstring);
我知道这是不可能的,因为EF会尝试在SQL端执行投影。它告诉我:“LINQ to Entities无法识别方法'System.String MyStringFormattingExtension(System.String)'方法,并且此方法无法转换为存储表达式。”


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

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

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

db.Jobs
已经是一个
IEnumerable
,因此我想建议对其调用
ToList()
——它本来可以工作,但实际上,除非表非常小,否则效率会非常低。)

您可以定义一个用户定义的函数并将其导入数据库。阅读更多细节

// 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);

谢谢你的意见。不幸的是,我认为我们无法做到这一点。我们正在使用一个与多个站点集成的遗留数据库。我认为StringFormattingExtension()是单向的。例如,我们有一些类似“维尔京群岛(英国)”的值,显示为“维尔京群岛英国”。没有办法知道括号什么时候被去掉了,我马上就到。因为我在函数中使用了正则表达式,所以我决定尝试使用CLR用户定义函数。我对此有点困惑,但我认为最好把它作为一个单独的问题发布在这里: