C# 实体框架,查询中未映射属性
我正在创建一个实体模型,我想在其中放置一个未映射的属性。这些属性用于简化从关系中访问值的过程。所示的模型只是一个简单的例子。 在名为C# 实体框架,查询中未映射属性,c#,entity-framework,dbcontext,C#,Entity Framework,Dbcontext,我正在创建一个实体模型,我想在其中放置一个未映射的属性。这些属性用于简化从关系中访问值的过程。所示的模型只是一个简单的例子。 在名为UserRole的users\u roles实体中,我希望具有UserName属性和RoleName public class UserRole { public int Id { get; set; } public int IdUser { get; set; } public int IdRole { get; set; }
UserRole
的users\u roles实体中,我希望具有UserName
属性和RoleName
public class UserRole
{
public int Id { get; set; }
public int IdUser { get; set; }
public int IdRole { get; set; }
public User User { get; set; }
public Role Role { get; set; }
[NotMapped]
public string UserName
{
get { return User.Name; }
}
[NotMapped]
public string RoleName
{
get { return Role.Name; }
}
}
这对我将来的过滤、数据绑定等都很重要。我不坚持这样的解决方案。这只是第一个想法
目前,如果我尝试按UserName
或RoleName
筛选实体,我会遇到一个例外,因为NotMapped
属性在数据库中不存在
第二件事是在DbContext
dispose之后获取属性值。目前,我正在使用.Include()
方法(即时加载),但是否可以以一种方式同时获得上述功能(filterint等和即时加载值)
编辑1:
我正在使用模型创建的code-First
策略。
编辑2:
好的,澄清一下,最基本的答案是创建一个这样的过滤方法
public IQueryable<UserRole> Filter(IQueryable<UserRole> query, string userName, string roleName)
{
return query.Where(x => x.User.Name.Contains(userName) && x.Role.Name.Contains(roleName));
}
publicIQueryable过滤器(IQueryable查询、字符串用户名、字符串角色名)
{
返回query.Where(x=>x.User.Name.Contains(userName)和&x.Role.Name.Contains(roleName));
}
基本上,如果你想
Context.UserRole.Where(x=>x.UserName == "login")
正如你所描述的,你将有一个例外。你可以通过使用
Context.UserRole.Include(x=>x.User).Where(x=>x.User.Name == "login")
您是否通过designer添加了这些属性!!!您必须手动将其添加到类中,而不是设计器中。DeEnginer希望为其显示的内容进行数据库映射/建模。不,这是
code-First
策略,因此我没有设计器。我忘了写了。过滤将不适用于Linq到实体,但肯定使用Linq到对象,检查这个-好的,这是我到目前为止使用的方式。基本上,上面的例子非常简单,当然你的答案很好,但是当我每次需要合并两个相关实体的字符串并检查其中一个是否存在时,我想要得到值,这就有问题了。也许没有其他解决方案:)来澄清上下文.UserRole.Where(x=>(x.User!=null?x.User.Name+”“:”“)+x.Role.Name==“sth”)
。可能有更复杂的查询。无法理解为什么需要这样做筛选。你把“狗”和“鸭子”相加。更好的解决方案是:Context.UserRole.Where(x=>x.User.Name==/null或其他/)。Where(x=>x.Role.Name==“sth”)也许这是一个更好的例子(但没有空检查)Context.User.Where(x=>x.FirstName+“”+x.LastName==“FullName”)
。这个全名是一个文本框中的一个值。但是可能存在一些问题-SQL标记不适用于此查询。如果桌子变大了,你的表现会很差。最好将FullName分为两部分,并将FirstName和LastName与这两部分进行比较。此外,您可以将FirstName和LastName作为FullName存储在表中。或者,您可以使用FirstName和LastName向表中添加一个持久计算列