【发布时间】:2014-10-30 15:07:33
【问题描述】:
我有两个系列。每个集合都包含特定类型的实例。我需要使用每个集合中实例的属性之一来连接这两个集合。问题是我只会在运行时知道要使用哪个属性来连接。那么如何为动态联接编写 LINQ 查询呢?这是带有静态连接的 LINQ 查询的代码。在下面的示例代码中,您会注意到我使用 MyTran.MyAmountUSD = YourTran.YourAmountUSD 加入两个集合。但在实际场景中,我只会在运行时才知道要使用哪个属性来连接。所以有时我可能需要加入 MyTran.MyAmountGBP = YourTran.YourAmountGBP。
class MyTran
{
public int Id { get; set; }
public double MyAmountUSD { get; set; }
public double MyAmountGBP { get; set; }
}
class YourTran
{
public int Id { get; set; }
public double YourAmountUSD { get; set; }
public double YourAmountGBP { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<MyTran> fMyTranList = new List<MyTran>();
List<YourTran> fYourTranList = new List<YourTran>();
fMyTranList.Add(new MyTran { Id = 1, MyAmountGBP = 100, MyAmountUSD = 1000 });
fMyTranList.Add(new MyTran { Id = 2, MyAmountGBP = 101, MyAmountUSD = 2000 });
fYourTranList.Add(new YourTran { Id = 11, YourAmountGBP=100, YourAmountUSD=1000 });
fYourTranList.Add(new YourTran { Id = 12, YourAmountGBP = 102, YourAmountUSD = 3000 });
var query = from fMyTrans in fMyTranList
join fYourTrans in fYourTranList
on fMyTrans.MyAmountUSD equals fYourTrans.YourAmountUSD
select new
{
MyId = fMyTrans.Id,
YourId = fYourTrans.Id,
MyAmtUSD = fMyTrans.MyAmountUSD,
MyAmtGBP = fMyTrans.MyAmountGBP,
YourAmtUSD = fYourTrans.YourAmountUSD,
YourAmtGBP = fYourTrans.YourAmountGBP
};
foreach (var fMatch in query)
{
Console.WriteLine(fMatch);
}
}
}
【问题讨论】:
-
erm,根据条件将
query设置为不同的值。switch或if语句应该会有所帮助。 -
谢谢乔德雷尔。不幸的是,“if”或“switch”语句不是一个选项。为简单起见,我只提到了两列。然而,在实际情况下,我们有超过 50 个不同的列,用户可以选择加入其中任何一个列。此外,列的名称、数量和数据类型因我们的客户而异,但我们需要编写一个通用代码,以便它可以满足所有这些需求。这就是静态查询在我们的案例中不起作用的原因,我们需要动态创建 LINQ 查询。
-
我建议你写一个问题来详细说明这个想法。
-
结果真的是一个匿名对象吗?或者你实际上有一个具体的结果类?
-
谢谢贾米克。在这个阶段我不确定。我们仍处于设计阶段,尚未决定具体类或匿名对象。由于数据架构可能因客户而异,我们将使用某种动态类,例如 ExpandoObject。