相交或联接将一个具有匹配属性的集合中的项目返回给另一个集合?

我有以下场景:两个不同Types列表碰巧包含3个匹配的属性(实际上,名称与来自不同系统/数据库表的名称不同,但它们的内容匹配)。

在我的例子中,我将属性命名为相同只是为了让它更容易!

我想得到一个列表,其中包含查找中匹配项的帐户的Prefix+Number+Suffix (注意:查找可以多次包含相同的值 – 对象中的其余属性不同)

这是我目前正在使用的代码,但它感觉很笨重。 是否有更清洁,更好的方法来实现相同的结果? 我试过“Contains()”,但不知道如何限制所有三个属性。

  var accounts = new List{ new Account{Prefix="001", Number="10101", Suffix="666"}, new Account{Prefix="001", Number="10202", Suffix="777"}, new Account{Prefix="001", Number="10303", Suffix="777"}, new Account{Prefix="002", Number="20101", Suffix="666"}, new Account{Prefix="002", Number="20101", Suffix="777"} }; var lookup = new List{ new Lookup{Prefix="001", Number="10101", Suffix="666"}, new Lookup{Prefix="001", Number="10101", Suffix="666"}, new Lookup{Prefix="002", Number="20101", Suffix="666"}, new Lookup{Prefix="001", Number="10101", Suffix="666"}, }; var match = ((from a in accounts select a) .Intersect(from l in lookup from a in accounts where l.Prefix == a.Prefix && l.Number == a.Number && l.Suffix == a.Suffix select a) ).Select(a => string.Format("{0}{1}{2}", a.Prefix, a.Number, a.Suffix)); 

您可以使用以下代码获取匹配项:

 var match = (from a in accounts select new { P = a.Prefix, N = a.Number, S = a.Suffix }) .Intersect(from l in lookup select new { P = l.Prefix, N = l.Number, S = l.Suffix }) .Select(t => string.Format("{0}{1}{2}", tP, tN, tS));; 

您可以在此处使用匿名类型上自动 生成的 相等运算符。

为什么不简单:

  match = (from l in lookup from a in accounts where l.Prefix == a.Prefix && l.Number == a.Number && l.Suffix == a.Suffix select string.Format("{0}|{1}|{2}", l.Prefix, l.Number, l.Suffix)) .Distinct(); 

试试这个:

 from a in accounts join l in lookup on new { a.Prefix, a.Number, a. Suffix } equals new { l.Prefix, l.Number, l. Suffix } into gls select a 

我不会直接使用表,但在这种情况下使用数据库视图。 创建一个为您执行联合的视图,并返回一个规范化的数据结构,如下所示:

 CREATE VIEW ExampleView AS SELECT Prefix = a.Prefix, Number = a.Number, Suffix = a.Suffix FROM FirstTable AS a UNION ALL SELECT Prefix = l.Prefix, Number = l.NumberWithDifferentName, Suffix = l.WeirdlyNamedSuffix FROM SecondTable AS l 

然后,您可以在该视图上运行一个简单的选择,而不是在您的应用程序中执行复杂的数据库逻辑,它实际上并不真正属于:

 SELECT Prefix, Number, Suffix FROM ExampleView; /* or obviously the LINQ equivalent */ 

这里有关于该问题的文章的链接(为什么要使用视图): http : //www.tdan.com/view-articles/5109 。 引用这个部分来解释为什么更好的做法让数据库做它最擅长的事情,而不是应用程序:

开发人员发现必须使用规范化的数据结构,这样做既费时又费时,因为它涉及编码从多个表连接数据的复杂SQL查询。 […]将非规范化数据结构“重构”为规范化数据结构之后总是极其困难和劳动密集型,有时甚至不可能(因为非关键字段中的数据必须“重构”为关键字字段,这些字段中的数据可能缺少或不正确的值)。

为什么不尝试加入他们之间

 from a in accounts join l in lookup on new { a.Prefix, a.Number, a. Suffix} equals new { l.Prefix, l.Number,l. Suffix} select a;