0

問題がありlinqます..

コードを見てみましょう

私は記事クラスを持っています:

public calss Article
{
    public string Tag{get; set; }
}

記事の各タグを,コンマで区切って保存しています。

例えば ​​:first,second,third

記事を取得したいときは、共通のタグを持つ記事を取得したいと考えています。

私はこのクエリを使用しますが:

var relatedArticles = 
        _db.Articles.Where(a => a.Tag
                                 .Split('،')
                                 .Any(t => article.Tag
                                                  .Split('،')
                                                  .Any(ac => ac == t)));

そして、私はこの例外を受けています:

LINQ to Entities がメソッド 'System.String[] Split(Char[])' メソッドを認識しない

その他の方法で?

更新: 記事を挿入するときにユーザーが好きなだけタグを作成できるようにする必要があるため、別のテーブルにタグを保持することはできません。記事をデータベースに保存するときに、そのタグが存在するかどうかを確認するのはオーバーヘッドになります。

4

5 に答える 5

1

クラスを次のように設定します。

public class Article
{
    public List<string> Tag{get; set; }
}

2 番目のステートメントが何をするかは 100% わかりませんが、 a.Tag.Contains() を使用して値を確認できます。

于 2013-11-05T08:30:59.363 に答える
1

私のコメントはあなたの問題に対する答えとして価値があると思うので、1つとして書き留めます:)

テーブル/クラスの設計について考える必要があります。

n:m 参照のように見えるため、正規化する必要があります。arcticleId と tagId を参照するマッピング テーブルへの参照を使用して記事を 1 つのテーブルに保持し、主キー tagId を使用してそのタグを使用して 1 つのテーブルを参照します。将来 1 つのタグが変更される場合、すべての記事を更新する必要はありません。その特定のタグを更新するだけで、すべての記事で変更されます。

于 2013-11-05T08:59:23.397 に答える
0

EF を使用する場合、Linq で直接のように通常のメソッドを呼び出すことはstring.Split()できません。これは、SQL に変換できないためです。

句に追加AsEnumerable()して、Where()Linq にデータを取得させ、後でそのような操作を実行できるようにすることができます。残念ながら、それではリスト全体をフェッチせずにリストでやりたいことを行うことはできません。

おそらく、代わりに次のようなことができますか?:

 List<string> tagsForCurrentArticle = ... // fetch this first somehow

 _db.Articles.Where(a =>  
                      tagsForCurrentArticle.Any(tag => 
                                                   a.Tag.Contains(tag)))

明確にするために注意してください。これは機能するはずですが、可能であれば、他の人が示唆しているように、タグを別のテーブルに移動することをお勧めします。

于 2013-11-05T08:38:22.910 に答える
0

これは、エンティティへの Linq が、SQL クエリとして記述できる分割メソッドの翻訳を見つけられなかったことを意味します。分割機能を実行したい場合はToList()AsEnumerable()などを呼び出してレコードをメモリに取り込む必要があります。

しかし、より良いアプローチは、データベースにタグ用に別のテーブルを作成することです。

Linq クエリは次のようになります (記事とタグ間の多対多の関係を想定):

var relatedArticles = 
        _db.Articles.Where(a => a.Tags.Any(t => t.Articles.Count() > 1));
// if Article has Tag which is assigned more then to one Article then it suits us
于 2013-11-05T08:30:13.393 に答える
0

「a.Tag.Split('،')」は、実際の操作ではなく、IQueryable である式ツリー内のノードです。ToList などを呼び出して結果をマテリアライズすると、実行前に式ツリー全体が SQL 式に変換されます。これがエラーのポイントです。これは、トランスレータが Split() メソッドを SQL ステートメントに変換する方法を知らないためです。別の方法として、すべての
結果をアプリに 取得し、ToList() で具体化してから、必要なことを IEnumerables として行うことができます。また、ストアド プロシージャを作成し、そこに検索タグ配列を渡すこともできます。 また、うまくいくかもしれません-単純な値の配列(メソッドとしてではなく)をクエリに渡して、結果のSQLが次のようになるようにしてください

"WHERE ... IN ...".
于 2013-11-05T08:31:02.727 に答える