【问题标题】:How do I use EntityDatasource (Or LinqDatasource) with a Union clause如何将 EntityDatasource(或 LinqDatasource)与 Union 子句一起使用
【发布时间】:2014-08-17 20:13:23
【问题描述】:

如何在 Entitydatasource 控件中合并两个表中的记录?我已经用谷歌搜索并在 SO 上搜索,但没有运气。我需要的SQL是

SELECT DISTINCT username FROM 
(SELECT s.username FROM project_stakeholders s
UNION
SELECT t.username FROM project_team_members t)

我的实体结构如下:

project_stakeholders
----------------------
project_stakeholders.record_id (PK)
project_stakeholders.username
project_stakeholders.project
project_stakeholders.project_id (FK)
project_stakeholders.status

project_team_members
---------------------
project_team_members.record_id (PK)
project_team_members.username
project_team_members.project
project_team_members.project_id (FK)
project_team_members.status

我发现这个问题几乎可以回答我的问题,但我的问题更高级,因为我的子查询来自与主要实体无关的实体。

我已将我的数据源更改为 LiqDatasource 控件,并在 LinqDatasource 控件的 Onselecting 事件的代码后面添加了以下代码:

    protected void TaskProfileDS_Selecting(object sender, LinqDataSourceSelectEventArgs e)
    {

        int project_id = 0;

        if (Int32.TryParse(Request.QueryString["id"], out project_id))
        {

            using (MyEntitiesContext db = new MyEntitiesContext())
            {
                var TeamMembers = from tm in db.team_members where tm.project_id == project_id select tm.username;
                var Stakeholders = from sh in db.project_stakeholders where sh.project_id == project_id select sh.username;
                var result = from usr in db.project_profiles where (TeamMembers.Contains(usr.caption) || Stakeholders.Contains(usr.caption)) select usr;

                e.Result = result;

            }
        }
    }

但不幸的是,我收到以下错误:

操作无法完成,因为 DbContext 已被释放。

任何想法将不胜感激。

【问题讨论】:

  • 某些类型是从其他类型派生的?如果是,请使用dbset<baseType>().Union(dbset<Derived>())

标签: asp.net entity-framework entitydatasource linqdatasource


【解决方案1】:

这是我从不相关的表(实体)中获取记录的代码。我使用了 LinqDataSource,然后在 QueryCreated 事件中,我将查询更改为我自己的 LINQ 查询:

protected void TaskDS_QueryCreated(object sender, QueryCreatedEventArgs e)
    {
        int project_id = 0;

        if (Int32.TryParse(Request.QueryString["id"], out project_id))
        {

            using (SDManagerEntities db = new SDManagerEntities())
            {
                List<project_profiles> usrs = new List<project_profiles>();

                var users1 = db.team_members.Where(t => t.project_id == project_id).Select(it => it.username);
                var users2 = db.project_stakeholders.Where(s => s.project_id == project_id).Select(it => it.username);

                var allMembers = users1.Concat(users2);

                foreach (var member in allMembers.Distinct())
                {
                    project_profiles usr = db.project_profiles.SingleOrDefault(it => it.caption == member);
                    if (!usrs.Contains(usr))
                    {
                        usrs.Add(usr);
                    }
                }

                e.Query = usrs.AsQueryable().OrderBy(it => it.fullName);

            }
        }
    }

希望对别人有帮助

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 2010-10-10
    • 2011-07-22
    • 2013-08-16
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多