我有一些无法直接相互访问的数据对象集合。我想最好的解决方案是让数据库人员对此进行查询,但与此同时,有什么方法可以收紧这个问题吗?
var conflicting = allFoos.Where(foo => foo.ElectronicSerialNumber != 0
&& foo.BarID != interestingBar.ID)
.Join(fooInfoCollection, foo => foo.ElectronicSerialNumber,
fooInfo => fooInfo.ElectronicID,
(foo, fooInfo) => foo)
.Join(allBars, foo => foo.BarID, bar => bar.ID, (foo, bar) => bar)
.Where(bar => bar.SomeCriteria == false)
.FirstOrDefault();
if (conflicting != null)
{
doStuff(conflicting);
}
答案 0 :(得分:1)
看起来你已经从数据库中获取了所有Foos,所有FooInfos和所有Bars,以便您可以进行查询,其中您实际上只需要一个Bar对象作为结果。如果你不得不从数据库中获取所有这些对象以用于另一个查询,那么这是可以的,但如果你只为这一个查询得到所有这些对象,那么这是非常低效的。您应该尝试让数据库执行查询,并只返回您需要的一个对象。
即使没有外键约束,你仍然可以进行连接,你可以在Linq To SQL中的类型之间set up relationships,即使它们实际上不存在于数据库中,也可以更容易地制定你的查询。
答案 1 :(得分:0)
在样式上接受 Lambda语法使用的连接可能很困难。 查询理解语法具有更好的加入方式。执行相同的操作。
Bar conflicting =
(
from foo in allFoos
where foo.ElectronicSerialNumber != 0
where foo.BarID != interestingBar.ID
join fooInfo in fooInfoCollection
on foo.ElectronicSerialNumber equals fooInfo.ElectronicID
join bar in allBars
on foo.BarID equals bar.ID
where !bar.SomeCriteria
select bar
).FirstOrDefault();
注意,如果要使用它们,foo和fooInfo(和bar)在select子句中是范围内的。