在LINQ中使用引用号获取所有记录



使用linq填充逻辑从表中读取少量记录并不复杂。谁能给我一个好的选择来处理我的并发症?我有一个这样的表

ContractID, ContractDate, PreviousReference
1           1/1/2012      
2           1/2/2012      1
3           1/8/2015
4           1/3/2015      2

我的表格中有一些合同信息。有时一些联系人有以前的合同参考。如果有以前的参考资料,我需要阅读所有以前的最新合同参考资料。假设合约id为4,它有两个引用,所以我也需要得到前两个记录。

在LINQ中是否有任何选项来处理这种循环

您想要递归地获得先前引用吗?因此,如果合同[4]有前参考文献2,合同[2]有前参考文献1,如果您要求合同[4]的前参考文献,您是只需要合同[2]的前参考文献,还是也需要合同[1]的所有前参考文献?(在你的例子中,1号没有以前的参考资料,但如果有的话,如果你要求提供合同4的以前的参考资料,你还会需要它们吗?

你是否可以递归地处理这个取决于你的数据是IEnumerable<...>还是IQueryable<...>。换句话说:数据是本地的,还是必须从另一个进程(如数据库管理系统)获取?

我不确定这是否可以由DBMS完成,这取决于SQL是否知道递归。

在局部过程中求解并不困难。

所以你有一个类契约,类似于下面的:
class Contract
{
public int Id {get; set;}
public Datetime Date {get; set;}
public int PreviousReference {get; set;}
}

这里的PreviousReferences就像另一个契约的外键,它可以有另一个契约的外键,而另一个契约可能有…等。

您希望将所有这些合同作为一个合同序列

为此,我们为Contract创建了一个扩展方法。如果您不熟悉扩展方法,请参见[扩展方法揭秘][1]
public static IEnumerable<Contract> GetPreviousReferences(this Contract contract,
IList<Contract> contracts)
{
// TODO: implement
}

用法如下:

List<Contract> myContracts = ...
Contract contract = myContracts[4];
List<Contract> previousReferences = contract.GetPreviousReferences(myContracts)
.ToList();

如果PreviousReferences的定义是明确的,实现是简单的:

合约的PreviousReferences集合是合约的0或1个PreviousReference +合约的PreviousReference的所有PreviousReferences

public static IEnumerable<Contract> GetPreviousReferences(this Contract contract,
IList<Contract> contracts)
{
if (contract.PreviouseReference != 0)
{
// this contract has previous references:
Contract previousContract = contracts[contract.PreviousReference];
yield return previousContract;
foreach (Contract previousReference in previousContract.GetPreviousReferences(contracts))
yield return previousReferences;
}
}

代替yield returnforeach(...),您可以使用LINQ Concat:

if (contract.PreviouseReference != 0)
{
Contract previousContract = contracts[contract.PreviousReference];
return new Contract[] {previousContract}
.Contcat(previousContract.GetPreviousContracts(contracts);
}

这将在内部为您执行foreach。我不确定这个解决方案是否更好读。[1]: http://geekswithblogs.net/BlackRabbitCoder/archive/2013/03/08/c.net-little-wonders-extension-methods-demystified.aspx

最新更新