Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在实体框架中有条件地包含()_C#_.net_Entity Framework - Fatal编程技术网

C# 在实体框架中有条件地包含()

C# 在实体框架中有条件地包含(),c#,.net,entity-framework,C#,.net,Entity Framework,我将EF4.3与DbContext一起使用 我有一个存储在缓存中的实体,所以我需要在转换为列表并在缓存中弹出之前加载必要的数据 我的数据库是标准化的,所以数据分布在几个表中。基本实体是“用户”,用户可以是也可以不是“订阅者”,订阅者可以是3种类型的“贡献者”、“成员”或“管理员”之一 目前,由于我缺乏EF、Linq等方面的知识,整个提取过程不是很优雅 public static User Get(Guid userId) { Guard.ThrowIfDefaul

我将EF4.3与DbContext一起使用

我有一个存储在缓存中的实体,所以我需要在转换为列表并在缓存中弹出之前加载必要的数据

我的数据库是标准化的,所以数据分布在几个表中。基本实体是“用户”,用户可以是也可以不是“订阅者”,订阅者可以是3种类型的“贡献者”、“成员”或“管理员”之一

目前,由于我缺乏EF、Linq等方面的知识,整个提取过程不是很优雅

    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");
}