实体框架查询

时间:2010-08-06 17:12:59

标签: entity-framework entity-framework-4

我在我们的一个Entity Framework应用程序中遇到了这段代码。我知道必须有一个比这个代码执行的三个查询更好(更有效)的方法。虽然,我不能完全正确的语法。 (我自己仍在学习实体框架..)

涉及两个表格。这是一个简单的父母/子女关系。

有一个Call表,其中包含有关所有呼叫的信息,并且有一个Units表,其中包含分配给每个呼叫的各个序列号(单位)。注意,这不是一个很多很多的关系。 Units表可以/将包含重复记录(序列号)!!

一个电话可以在Units表中有0-Many子记录。

因此,当呼叫者呼入时,我们的Cust Rep输入一个序列号(始终在Units表中创建一个新记录),它将该呼叫与此呼叫相关联。此时,我们填充“呼叫历史记录”选项卡。此选项卡由以下查询构建。 (搜索“单位”表并查找与该单位匹配的所有单位,然后返回分配给所有这些单位(记录)的所有呼叫。)

总结一下。查询的目标是:基于callID,查找数据库中的任何其他调用,这些调用也与分配给此调用的任何序列号相关联。

考虑到Entity Framework在tblCall表中创建了一个名为“Categories”的导航,并在名为“Call”的tblCategory表中创建了一个导航,必须有一种更好/更有效的方式来编写此查询。我真的想重构它。 :)

以下是现有查询:

    //First, get all the Serial Numbers assigned to this Call.
    var serials = from units in context.tblUnits
                where units.callID == callID
                select units.unitSerialNumber;

    List<string> serialsList = serials.ToList<string>();

    //Get all of the Call IDs that are assigned to any of the serial numbers from the list above
    var callIDs = from units in context.tblUnits
                    where serialsList.Contains(units.unitSerialNumber)
                    select units.callID;

    List<int> callIDList = callIDs.ToList<int>();

    //Return all of the calls that are in the callID list from above
    var data = from calls in context.tblCalls
                where callIDList.Contains(calls.callID)
                select calls;

    result = data.ToList<tblCall>();

任何建议都非常适合!

感谢你的帮助丹尼尔。这是最终查询:

var query = (from u1 in context.tblUnits
             join u2 in context.tblUnits on u1.unitSerialNumber equals u2.unitSerialNumber
             join c in context.tblCalls on u2.callID equals c.callID
             where u1.callID == callID
             select c).Distinct();

result = query.ToList();

1 个答案:

答案 0 :(得分:0)

我认为你可以用类似的查询替换它:

var query = from u1 in context.tblUnits
        join u2 in context.tblUnits on u1.unitSerialNumber equals u2.unitSerialNumber
        join c in context.tblCalls on (u2.callID ?? -1) equals c.callID
        where u1.callID == callID
        select c;

var result = query.ToList();