1

url形式の文字列(例: united-kingdom )を取得し、そのような方法で形式化されていないCountry列(例: United Kingdom )に対するWHERE句で使用できるようにしたいと思います。

理想的には、次のようなことができるようにしたいと思います。

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

EFはSQL側でプロジェクションを実行しようとするため、これはダメだと理解しています。「LINQtoEntitiesはメソッド'System.StringMyStringFormattingExtension(System.String)'メソッドを認識せず、このメソッドをストア式に変換できません。」

where句を適用する前に、クエリを列挙可能として返すことをお勧めしますが、これはかなり非効率的だと思います。つまり、フィルタリングの前にDBからすべての行を返します。

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 に答える