C# 在实体框架中有条件地包含()
我将EF4.3与DbContext一起使用 我有一个存储在缓存中的实体,所以我需要在转换为列表并在缓存中弹出之前加载必要的数据 我的数据库是标准化的,所以数据分布在几个表中。基本实体是“用户”,用户可以是也可以不是“订阅者”,订阅者可以是3种类型的“贡献者”、“成员”或“管理员”之一 目前,由于我缺乏EF、Linq等方面的知识,整个提取过程不是很优雅C# 在实体框架中有条件地包含(),c#,.net,entity-framework,C#,.net,Entity Framework,我将EF4.3与DbContext一起使用 我有一个存储在缓存中的实体,所以我需要在转换为列表并在缓存中弹出之前加载必要的数据 我的数据库是标准化的,所以数据分布在几个表中。基本实体是“用户”,用户可以是也可以不是“订阅者”,订阅者可以是3种类型的“贡献者”、“成员”或“管理员”之一 目前,由于我缺乏EF、Linq等方面的知识,整个提取过程不是很优雅 public static User Get(Guid userId) { Guard.ThrowIfDefaul
public static User Get(Guid userId)
{
Guard.ThrowIfDefault(userId, "userId");
var r = new CrudRepo<User>(Local.Items.Uow.Context);
var u = r.FindBy(x => x.UserId == userId)
.Include("BookmarkedDeals")
.Include("BookmarkedStores")
.SingleOrDefault();
if (u.IsNotNull() && u.IsActive)
{
if (u.IsAdmin)
{
u.GetAdministrator();
}
else if (u.IsContributor)
{
u.GetContributor();
}
else if (u.IsMember)
{
u.GetMember();
}
else
{
string.Format("Case {0} not implemented", u.UserRoleId)
.Throw<NotImplementedException>();
}
}
return u;
}
公共静态用户Get(Guid userId)
{
ThrowIfDefault(userId,“userId”);
var r=新的CrudRepo(Local.Items.Uow.Context);
var u=r.FindBy(x=>x.UserId==UserId)
.包括(“书签说明”)
.包括(“书签商店”)
.SingleOrDefault();
if(u.IsNotNull()&&u.IsActive)
{
如果(美国行政长官)
{
u、 GetAdministrator();
}
否则,如果(美国是供应商)
{
u、 GetContributor();
}
否则,如果(美国成员)
{
u、 GetMember();
}
其他的
{
格式(“未实现大小写{0}”,u.UserRoleId)
.Throw();
}
}
返回u;
}
每个“Get”方法都获取一个订阅方实体以及角色类型的相关Include()实体
我敢肯定,这可以做得比这更轻松,但要在最初的思考过程中挣扎
有人帮忙吗
更新了其中一个Get方法的示例
public static void GetMember(this User user)
{
Guard.ThrowIfNull(user, "user");
var r = new ReadRepo<Subscriber>(Local.Items.Uow.Context);
user.Subscriber = r.FindBy(x => x.UserId == user.UserId)
.Include("Kudos")
.Include("Member.DrawEntries")
.Include("Member.FavouriteCategories")
.Include("Member.FavouriteStores")
.Single();
}
publicstaticvoidgetmember(此用户)
{
Guard.ThrowIfNull(用户,“用户”);
var r=新的ReadRepo(Local.Items.Uow.Context);
user.Subscriber=r.FindBy(x=>x.UserId==user.UserId)
.包括(“荣誉”)
.包括(“成员付款人”)
.包括(“成员.收藏夹类别”)
.包括(“会员收藏店”)
.Single();
}
如果您的“用户”实体连接到其他实体,则可以使用连接实体集合的加载方法来获取相关实体。例如,如果您的“用户”实体有一个属性“Subscriber”,您可以调用u.Subscriber.Load()来获取相关实体。这里是相关的
没有地方测试这个,但你试过吗?就个人而言,我不介意。我不知道我有多喜欢实体上可以得到其他实体的方法。我个人不会这么做,因为我喜欢我的实体纯粹干净的数据存储。我写这篇文章不是为了回答,因为这是我的观点。我想如果它对你有用,而且可读,那就好了。我总是牢记这一点:根据需要更改函数代码。不是因为你觉得它难看吗?“外面总是有更大的鱼要炒。你能告诉我一种“得到…”的方法吗?它们到底做什么?”Slauma补充道example@RyanBennett我之所以从一个实体调用另一个实体,是因为它们实际上是一个实体——一个“用户”。只有db表的规范化才能使它们分开。我想您的代码适合这种情况。我认为不能将其压缩到单个数据库查询中。但也许其他人有一个想法(也许使用投影而不是包含)。
var u = r.FindBy(x => x.UserId == userId)
.Include("BookmarkedDeals")
.Include("BookmarkedStores")
.SingleOrDefault();
if(someCondition)
{
u = u.Include("something");
}