C# LINQ:有没有办法将这些查询合并成一个查询?
我有一个包含3个表的数据库:C# LINQ:有没有办法将这些查询合并成一个查询?,c#,asp.net,sql-server,asp.net-mvc,linq,C#,Asp.net,Sql Server,Asp.net Mvc,Linq,我有一个包含3个表的数据库: 电话 电话列表 音素条件 PhoneListings具有来自Phones表(PhoneID)的FK和来自Phone Conditions表(conditionID)的FK 我正在开发一个函数,该函数将电话列表添加到用户的购物车中,并为用户返回所有必要的信息。电话品牌和型号包含在电话表中,有关条件的详细信息包含在电话条件表中 目前我使用3个查询来获取所有必要的信息。有没有办法将所有这些合并到一个查询中 public ActionResult phoneAdd(in
- 电话
- 电话列表
- 音素条件
public ActionResult phoneAdd(int listingID, int qty)
{
ShoppingBasket myBasket = new ShoppingBasket();
string BasketID = myBasket.GetBasketID(this.HttpContext);
var PhoneListingQuery = (from x in myDB.phoneListings
where x.phonelistingID == listingID
select x).Single();
var PhoneCondition = myDB.phoneConditions
.Where(x => x.conditionID == PhoneListingQuery.phonelistingID).Single();
var PhoneDataQuery = (from ph in myDB.Phones
where ph.PhoneID == PhoneListingQuery.phonePageID
select ph).SingleOrDefault();
}
您可以将结果投影到一个匿名类、元组甚至一行中的自定义形状实体中,但是总体数据库性能可能不会更好:
var phoneObjects = myDB.phoneListings
.Where(pl => pl.phonelistingID == listingID)
.Select(pl => new
{
PhoneListingQuery = pl,
PhoneCondition = myDB.phoneConditions
.Single(pc => pc.conditionID == pl.phonelistingID),
PhoneDataQuery = myDB.Phones
.SingleOrDefault(ph => ph.PhoneID == pl.phonePageID)
})
.Single();
// Access phoneObjects.PhoneListingQuery / PhoneCondition / PhoneDataQuery as needed
LINQSingle
和SingleOrDefault
扩展的重载稍微紧凑一些,它们将谓词作为参数,这将有助于稍微减少代码
编辑
作为从ORMDbContext
中多次检索或执行显式手动Join
s的替代方法,如果您通过可导航的连接键(通常是基础表中的外键)在模型中的实体之间进行设置,则可以使用以下命令指定带急切加载的获取深度:
它将返回phoneListingWithAssociations中的实体图
(假设外键PhoneListing.phonePageID=>Phones.phoneId
和
PhoneCondition.conditionID=>PhoneListing.phonelistingID
)我认为,通过join,您应该能够在一个查询中提取所有内容
但正如所指出的,你可能不会从中获得很多速度,因为你只是选择了第一场比赛,然后继续前进,而不是真正做任何内在的比较
如果您知道每个表中至少存在一个数据点,那么您也可以同时提取所有数据点。若并没有,那个么等待“子查询”就像StuartLC做的那个样好
var Phone = (from a in myDB.phoneListings
join b in myDB.phoneConditions on a.phonelistingID equals b.conditionID
join c in ph in myDB.Phones on a.phonePageID equals c.PhoneID
where
a.phonelistingID == listingID
select new {
Listing = a,
Condition = b,
Data = c
}).FirstOrDefault();
FirstOrDefault,因为如果存在多个元素,single将抛出错误。您的合并理由是什么?这样我就可以从一个对象获得所需的所有信息,而不必引用三个不同的对象。可能有些过分,但我认为学习如何做到这一点是值得的。你也可以使用join
var Phone = (from a in myDB.phoneListings
join b in myDB.phoneConditions on a.phonelistingID equals b.conditionID
join c in ph in myDB.Phones on a.phonePageID equals c.PhoneID
where
a.phonelistingID == listingID
select new {
Listing = a,
Condition = b,
Data = c
}).FirstOrDefault();