1

我正在尝试在一个非常简单的表上运行查询,但没有得到任何结果。该表包含具有以下列的操作日志:

  • ID
  • ActionTypeID(创建、编辑或删除)
  • EntryID(创建/编辑/删除条目的id)
  • TableName(提交操作的位置)
  • 控件名称
  • 人员(执行该操作的人。具有部门的 nt-user)
  • 日期

我想要得到的是所有 EntryID 的列表,其中 ActionTypeID == 1 和以动态字符串列表之一结尾的 Person(部门)。问题是只应检查操作日志中一个 EntryID 的第一个操作以匹配其中一个部门。

我知道这听起来很奇怪。这可能是由于我的英语不好和我以前的同事的数据库设计障碍造成的。我不知道哪个更糟。

我试图得到我想要的结果是这样的:

var predicate = PredicateBuilder.False<ActionLog>();
var pOuter = PredicateBuilder.True<ActionLog>();

pOuter = pOuter.And(h => h.TableName.ToUpper() == "Contact".ToUpper());
pOuter = pOuter.And(h => h.ActionType.ID == 1);

foreach (var dep in b.DepartmentList)
{
    predicate = predicate.Or(x => x.Person.EndsWith("/" + dep.Value));
}

pOuter = pOuter.And(predicate.Expand());

mContactIDs = (from h in db.ActionLog
orderby h.Date
select h).AsExpandable().Where(pOuter).Select(x => x.EntryID).Distinct().ToList();

但这会将“人员”以所选部门结尾的所有条目返回给我。我只想用这个 EntryID 检查第一个条目。

我希望任何人都能理解我要从困惑的德语翻译成奇怪的英语的内容。

哦-顺便说一句,这是.Net 3.5

编辑 我认为我在找到正确的解释时遇到了一些问题——我会用一些虚拟数据来尝试。

ID | ActionTypeID | EntryID | TableName  | ControlName | Person             | Date
----------------------------------------------------------------------------------------
1  | 1            | 3       | 'Contacts' | NULL        | 'xxxx/department1' | 04/11/2012
2  | 1            | 3       | 'Contacts' | NULL        | 'yyyy/department2' | 04/11/2012
3  | 1            | 5       | 'Contacts' | NULL        | 'yyyy/department2' | 04/13/2012
4  | 1            | 14      | 'Contacts' | NULL        | 'zzzz/department1' | 04/16/2012

在我的示例中,我将搜索带有“以'/department2'结尾的人创建了第一次出现的新EntryID”、“TableName == 'Contacts'”和“ActionTypeID == 1”的日志条目。我想收到的结果将是(仅 EntryIDs)5,因为这是 Department2 的用户是第一个用户的唯一条目 使用 ActionTypeID 1 插入此 EntryID。我知道这很愚蠢,如果我设计了数据库我不会这样做,但现在我必须处理它。如果要查询的部门数量不是动态的,我将使用以下代码段:

IQueryable<ActionLog> log = db.ActionLog;
mContactIDs = (from k in db.Contacts
    where (from h in log
        where h.TableName == "Contacts"
        && h.EntryID == k.ID
        && h.ActionType.ID == 1
        orderby h.Date
        select h).FirstOrDefault().Person.EndsWith("/" + b.Department)
    select k.ID).ToList();

但我不知道如何将那些动态部门与愚蠢的设计联系起来(以及一个条目的多个 ActionTypeID 1(创建)。我什至不知道为什么应用程序会保存这个)

谢谢你,本。

4

2 回答 2

0

dep.Value我认为问题在于foreach 循环内捕获的变量值(即)。复制变量并在表达式中使用它。这个问题在这里解释。

foreach (var dep in b.DepartmentList)
{
    var depValue = dep.Value;
    predicate = predicate.Or(x => x.Person.EndsWith("/" + depValue));
}
于 2012-04-17T04:01:11.527 回答
0

我决定改用 Entity SQL。

        List<int> mContactIDs = new List<int>();
        using (var db = new Entities())
        {
            string queryString = @"
                                SELECT  
                                    VALUE H.EntryID
                                FROM    
                                    Entities.ActionLog AS H
                                WHERE 
                                    H.ID IN (
                                        SELECT VALUE TOP (1) Hi.ID
                                        FROM Entities.ActionLog AS Hi
                                        WHERE Hi.ActionType.ID = 1
                                        AND Hi.TableName = 'Kontakt'
                                        AND Hi.EntryID = H.EntryID
                                        ORDER BY Hi.Date    
                                    )
                                {0}
                                GROUP BY H.EntryID";

            List<string> lDepartments = new List<string>();
            foreach (var dep in b.DepartmentList)
            {
                lDepartments.Add(string.Format(" H.Person LIKE '%{0}' ", dep.Value));
            }

            string sDepartmentQuery = string.Empty;
            if (lDepartments.Count > 0)
            {
                sDepartmentQuery = string.Format(" AND ({0}) ", string.Join(" OR ", lDepartments.ToArray()));
            }

            var result = db.CreateQuery<int>(string.Format(queryString, sDepartmentQuery));
            if (result != null && result.Count() > 0)
            {
                mContactIDs = result.ToList();
            }
        }
于 2012-04-23T13:19:26.437 回答