我在我们的一个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();
答案 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();