C# LINQ:有没有办法将这些查询合并成一个查询?

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

我有一个包含3个表的数据库:

  • 电话
  • 电话列表
  • 音素条件
PhoneListings具有来自Phones表(PhoneID)的FK和来自Phone Conditions表(conditionID)的FK

我正在开发一个函数,该函数将电话列表添加到用户的购物车中,并为用户返回所有必要的信息。电话品牌和型号包含在电话表中,有关条件的详细信息包含在电话条件表中

目前我使用3个查询来获取所有必要的信息。有没有办法将所有这些合并到一个查询中

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
LINQ
Single
SingleOrDefault
扩展的重载稍微紧凑一些,它们将谓词作为参数,这将有助于稍微减少代码

编辑

作为从ORM
DbContext
中多次检索或执行显式手动
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();