是否有可能在不更改其类型的情况下从查询对象中删除属性或至少将其设置为null ?

本文关键字:属性 删除 null 设置 查询 有可能 类型 是否 情况下 对象 | 更新日期: 2023-09-27 17:54:44

所以我有这个LinQ查询

var users = from user in dbContext.Users
            where user.IsPublic
            select user;

问题是,这个用户有其他属性,我不希望返回,如passwordHash或email。

选择进入new User{Id=user.Id, First...}也会导致这个经典的错误。可能因为User扩展了AspNetIdentityUser

实体或复杂类型'MyProject '。类型中不能构造UserLINQ to Entities查询

我知道我可以创建一个新类并选择它,但我希望返回类型为User

是否有可能从User中删除属性/字段,至少在不改变其类型的情况下进行查询时将其设置为null ?

是否有可能在不更改其类型的情况下从查询对象中删除属性或至少将其设置为null ?

您可以将所有需要的属性选择为匿名类型,具体化结果,然后使用它来构建用户列表。第一个查询使用类似SQL的语法,第二个链语法。

private static void Main(string[] args)
{
    List<User> Users = new List<User>()
    {
        new User {Id = 1, Name = "N1", IsPublic = true},
        new User {Id = 2, Name = "N2", IsPublic = true},
        new User {Id = 3, Name = "N3"}
    };
    var users1 = from u in (from user in Users
        where user.IsPublic
        select new {user.Id, user.Name}).ToList()
        select new User {Id = u.Id, Name = u.Name};
    var users2 =
        Users.Where(x => x.IsPublic)
            .Select(user => new {user.Id, user.Name})
            .ToList()
            .Select(x => new User {Id = x.Id, Name = x.Name});
    Console.ReadLine();
}

显然你不允许在Linq to entities语句中新建映射到数据库的实体。

这可以防止您将部分结果选择到映射类中。我建议您创建单独的类并返回它,因为使用相同的类,这个函数签名会变得非常容易误导-人们可能会期望它返回完整的用户对象。

你可以通过选择你需要的值,然后在查询之外创建用户来解决这个问题。

试试这个:

public List<User> GetPublicUsers()
{
    var existingUsers = dbContext.Users
        .Where(u => u.IsPublic);
    var result = new List<User>();
    foreach(var existingUser in existingUsers)
    {
        result.Add(new User { Id = existingUser.Id, ...}));
    }
    return result;
}

好吧,这从两个答案中得出了太多的结论。看到返回类型必须是可查询的,它还没有完成,因为我希望完全隐藏一些列,我刚刚设法修改它们的值。我真的很讨厌breezejs,因为它让我们暴露了太多的模式

public IQueryable<User> Users()
 {
     var users = from user in _db.Context.Users
         where user.IsPublic
         select user;

     foreach (var user in users)
        {
            user.PasswordHash = null;
            user.PhoneNumber = null;
            user.Logins.Clear();
            user.Email = null;
            user.AccessFailedCount = 0;
            user.Roles.Clear();
            user.SecurityStamp = null;
            user.TwoFactorEnabled = user.EmailConfirmed = user.PhoneNumberConfirmed = false;
            user.Claims.Clear();
        }
        return users;
    }

我真的希望这些列是不可见的,因为它只需要Id和名称…但. .我想这样就行了。现在