5

次のような2つのエンティティ、UsersとFriendshipsがあります。

    public class User
    {
        public int UserId { get; set; }
        (...)
    }

    public class Friendship
    {
         public int SenderId { get; set; }
         public int ReceiverId { get; set; }
         (...)
    }

そして、SQLでは次のような単純なクエリを作成したいと思います。

    SELECT * FROM Users as U
    INNER JOIN Friendships as F ON U.UserId = F.ReceiverId OR U.UserId = F.SenderId
    Where U.Nick != VARIABLE

つまり、ユーザーのすべての友達を選択したいと思います。

そして、私はそれを達成することはできません。unionを使用して2つの個別の結合クエリを作成し、それが機能するソリューションを見つけましたが、dbに対してそのようなクエリを作成するのは効率的ではありません。

4

2 に答える 2

4

LINQ の結合は常に等結合です。from基本的に、複数の句と句が必要ですwhere

var query = from u in db.Users
            where u.Nick != variable
            from f in db.Friendships
            where u.UserId == f.ReceiveId || u.UserId == f.SenderId
            select ...;

現在、LINQ to Objects では、おそらくこれを行うためのより効率的な方法がありますが、SQL ベースの LINQ プロバイダーが十分な実行計画を持つクエリを生成することを期待しています。実際にはSQLでJOINを作成しない場合がありますが、表示した結合と同じ実行計画になると思います。

于 2012-09-26T21:13:51.700 に答える
1

単に書く:

from U in db.Users
from F in Friendships.Where(x => U.UserId == F.ReceiverId || U.UserId == F.SenderId)
where U.Nick != VARIABLE
select new {u, f};
于 2012-09-26T21:15:36.080 に答える