是否可以在不更改其类型的情况下从查询中的对象中删除 属性 或至少将其设置为 null?
Is it possible to remove a property or at-least set it null from object in a query without changing its type?
所以我有这个 LinQ 查询
var users = from user in dbContext.Users
where user.IsPublic
select user;
问题是这个用户有其他我不想返回的属性,例如 passwordHash 或 email。
另外 select 进入 new User{Id=user.Id, First...}
会导致此 classic 错误。可能是因为用户扩展了 AspNetIdentityUser
The entity or complex type 'MyProject.User' cannot be constructed in a
LINQ to Entities query.
我知道我可以在其中创建一个新的 class 和 select,但我希望返回的类型为 User
是否可以在不更改其类型的情况下从 User
中删除 property/field 至少将其设置为 null?
显然您不能在 Linq To Entities 语句中更新映射到数据库的实体。
这可以防止您选择部分结果到映射的 classes 中。我建议您创建单独的 class 和 return,而不是通过使用相同的 class 这个函数签名变得非常误导 - 人们可能认为它是 return 的完整用户对象。
您可以通过选择所需的值然后在查询之外创建用户来解决此问题。
试试这个:
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;
}
您可以 select 将所有需要的属性设置为匿名类型,具体化结果,然后使用它构建用户列表。
第一个查询使用 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();
}
好吧,这从两个答案中得出了太多。看到 return 类型必须是 IQueryable 它尚未完成,因为我希望完全隐藏一些列,我刚刚设法修改它们的值.. 我真的很讨厌 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;
}
我真的希望这些列对 breeze 不可见,因为它只需要 ID 和名称...但是..我想现在就可以了..
所以我有这个 LinQ 查询
var users = from user in dbContext.Users
where user.IsPublic
select user;
问题是这个用户有其他我不想返回的属性,例如 passwordHash 或 email。
另外 select 进入 new User{Id=user.Id, First...}
会导致此 classic 错误。可能是因为用户扩展了 AspNetIdentityUser
The entity or complex type 'MyProject.User' cannot be constructed in a LINQ to Entities query.
我知道我可以在其中创建一个新的 class 和 select,但我希望返回的类型为 User
是否可以在不更改其类型的情况下从 User
中删除 property/field 至少将其设置为 null?
显然您不能在 Linq To Entities 语句中更新映射到数据库的实体。
这可以防止您选择部分结果到映射的 classes 中。我建议您创建单独的 class 和 return,而不是通过使用相同的 class 这个函数签名变得非常误导 - 人们可能认为它是 return 的完整用户对象。
您可以通过选择所需的值然后在查询之外创建用户来解决此问题。
试试这个:
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;
}
您可以 select 将所有需要的属性设置为匿名类型,具体化结果,然后使用它构建用户列表。 第一个查询使用 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();
}
好吧,这从两个答案中得出了太多。看到 return 类型必须是 IQueryable 它尚未完成,因为我希望完全隐藏一些列,我刚刚设法修改它们的值.. 我真的很讨厌 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;
}
我真的希望这些列对 breeze 不可见,因为它只需要 ID 和名称...但是..我想现在就可以了..