1

オブジェクトへのlinqを使用したクエリは、非常に読みやすく、素晴らしいものになると思います。例えば:

from person in db.Persons.ToList()
where person.MessageableBy(currentUser) ...

MessageableBy は、ストア式 (SQL) に変換できないメソッドです。

    public bool MessageableBy(Person sender)
    {
        // Sender is system admin
        if (sender.IsSystemAdmin())
            return true;

        // Sender is domain admin of this person's domain
        if (sender.Domain.DomainId == this.Domain.DomainId && this.Domain.HasAdmin(sender))
            return true;

        foreach (Group group in this.Groups)
        {
            if (group.MessageableBy(sender)) 
                return true;
        }

        // The person is attorney of someone messageable
        if (this.IsAttorney)
        {
            foreach (Person pupil in this.Pupils)
                if (pupil.MessageableBy(sender)) 
                    return true;
        }

        return false;
    }

問題は、これはスケールしないと思うことです。データベースにいくつかのエントリがあることにすでに気付いているので、大規模なデータベースでは想像できません。

したがって、問題は次のとおりです。 エンティティへの linq とオブジェクトへの linq を混在させる必要があります (つまり、「where」の一部を ICollection に適用し、「where」の一部を .ToList() の結果に適用しますか? linq のみを使用する必要があります。エンティティに、非常に長い文で終わる?

4

3 に答える 3

2

.ToList()実際にクエリを実行し、そのテーブル内のすべてのデータをフェッチしますが、これは、常に少数のレコードになることが確実にわかっていない限り、必要なものではありません。そうです、あなたはするwhere前に節でもっとやるべきです.ToList()

于 2013-04-12T17:53:53.023 に答える
0

私はあなたの最初の分析に大部分同意します。Linq to Objects と Linq to Entities を混在させることは問題ありませんが、必要以上のデータを取得する必要があるため、将来的にスケーリングの問題が発生する可能性があります。

重要なクエリをサポートするようにデータ モデルを設計することを忘れないでください。おそらく、ユーザーは人である可能性があり、人は誰が誰にメッセージを送信できるかを決定する自己関係を持つことができます。これは、クエリ自体で MessableBy メソッドを実現できるように、データを表現する他の方法を検討するよう促すための単純な考えです。

それまでの間、パフォーマンスの問題が発生していない場合は、モデル設計の観点からこの問題を検討します。

于 2013-04-12T18:00:56.787 に答える
0

これは以前の回答者の発言を単純に言い換えたものですが、次のことを真に強調するのに十分重要であると私は信じています。

結果のデータをクライアントに送信する前に、DB サーバーで可能な限り多くの計算、特に可能な限り多くのフィルタリングと集計を実行することは、DB アプリケーションのパフォーマンスにとって重要です。

于 2013-04-12T18:01:16.923 に答える