C# linq left join仅包含匹配值的问题

C# linq left join仅包含匹配值的问题,c#,linq,entity-framework,C#,Linq,Entity Framework,我有以下代码 public async Task<List<UserBasicViewModel>> FindUsersWithFriendshipStatusAsync( Guid userId, string searchValue, int skip, int take) { var db = DbMakeLocalInstance; var userQue

我有以下代码

public async Task<List<UserBasicViewModel>> FindUsersWithFriendshipStatusAsync(
        Guid userId, 
        string searchValue, 
        int skip, 
        int take)
    {
        var db = DbMakeLocalInstance;
        var userQuery = 
            from user in db.Users
            where (user.FirstName.StartsWith(searchValue)
                   || user.LastName.StartsWith(searchValue)
                   || user.Name.StartsWith(searchValue)
                   || user.School.StartsWith(searchValue)
                   || user.SchoolClass.StartsWith(searchValue))
                   && user.UserId != userId
            join status in db.Friendship on user.UserId equals status.FriendUserId into fstatus
            from status in fstatus.DefaultIfEmpty()
            where status.UserId == userId
            select new {User = user, Status = status};
        var query2 = await (userQuery.OrderBy(u => u.User.Name)
            .Skip(skip)
            .Take(take)
            .ToListAsync()
            .ConfigureAwait(continueOnCapturedContext: false));

        var users = query2.Select(u => new UserBasicViewModel(u.User, u.Status)).ToList();
        return users;
    }
public async Task FindUsersWithFriendshipStatusAsync(
Guid用户ID,
字符串搜索值,
int skip,
整数(取整数)
{
var db=DbMakeLocalInstance;
var userQuery=
来自db.Users中的用户
其中(user.FirstName.StartsWith(searchValue)
||user.LastName.StartsWith(searchValue)
||user.Name.StartsWith(searchValue)
||user.School.StartsWith(searchValue)
||user.SchoolClass.StartsWith(searchValue))
&&user.UserId!=UserId
将user.UserId上的db.friendy的状态等于status.FriendUserId加入fstatus
来自fstatus.DefaultIfEmpty()中的状态
其中status.UserId==UserId
选择新建{User=User,Status=Status};
var query2=await(userQuery.OrderBy(u=>u.User.Name)
.Skip(Skip)
.拿(拿)
.ToListAsync()
.ConfigureAwait(continueOnCapturedContext:false));
var users=query2.Select(u=>newuserbasicviewmodel(u.User,u.Status)).ToList();
返回用户;
}
它应该为我提供与搜索查询和友谊状态匹配的所有用户(如果它与提供的
用户ID
存在)

问题在于,它只返回当前
userId
与搜索查询中匹配的用户之间已经存在关系的用户。我希望用户匹配的搜索查询没有任何匹配的友谊以及


请帮忙

您可以在左加入之前检查status.UserId和UserId之间的相等性

    from user in db.Users
    where (user.FirstName.StartsWith(searchValue)
           || user.LastName.StartsWith(searchValue)
           || user.Name.StartsWith(searchValue)
           || user.School.StartsWith(searchValue)
           || user.SchoolClass.StartsWith(searchValue))
           && user.UserId != userId
    join status in db.Friendship on new {user.UserId, searchUserId = userId} equals 
                                    new {UserId = status.FriendUserId, searchUserId = status.UserId} into fstatus
    from status in fstatus.DefaultIfEmpty()
    select new {User = user, Status = status};
你可以试试:

var userQuery = 
        from user in db.Users
        where (user.FirstName.StartsWith(searchValue)
               || user.LastName.StartsWith(searchValue)
               || user.Name.StartsWith(searchValue)
               || user.School.StartsWith(searchValue)
               || user.SchoolClass.StartsWith(searchValue))
               && user.UserId != userId
        select new {
            User = user,

            // I'm using single because I'm guessing there's only one match
            Status = db.Friendship
                .Where(f => f.FriendUserId == user.UserId && f.UserId == userId)
                .SingleOrDefault(),
        };

你不能让
where status.UserId==UserId
SingleOrDefault()
使它崩溃,所以必须将它更改为
FirstOrDefault()
,但在其他方面是完美的!非常感谢你!