【问题标题】:Linq to SQL - Best way to work with a collection of objects inside another objectLinq to SQL - 处理另一个对象内的对象集合的最佳方式
【发布时间】:2011-09-30 06:34:34
【问题描述】:

我有一张拍卖物品表和一张为这些物品出价的表格。数据库还有更多内容,但我们会保持简单。

public class Items
{
    public int ItemID { get; set; }
    public string ItemName { get; set; }
    public List<Bid> Bids { get; set; }
}

public class Bids
{
    public int BidID { get; set; }
    public int ItemID  { get; set; }
    public decimal Amount { get; set; }
    public datetime BidTime { get; set; }
    public int CustomerID { get; set; }
}

我想返回一个数据集,其中包括 ItemID、ItemName 和所有按 BidTime 排序的关联投标记录,降序排列。最后,我只想查看某个客户已出价的商品,并且我只想查看他们对该商品的出价。 Bids.ItemID 和 Items.ItemID 之间存在外键关系。我正在使用 Linq to SQL。

这可行并且似乎返回了正确的数据集:

from i in Items
from b in i.Bids
where i.AuctionID == 2 && b.CustomerID == (Int32?)1165
orderby b.BidTime descending
select new
{
    i.ItemID,
    i.ItemName,
    i.Bids
}

我是一名 SQL 专家,我试图深入了解 Linq 的 OO 特性。这是获得我想要的结果的最佳方法(甚至是好方法)吗?有没有更好的办法?

谢谢,

BK

【问题讨论】:

    标签: linq-to-sql object collections


    【解决方案1】:

    这个怎么样(语法稍微简单一些):

    由于评论而更新了 where 子句

    from i in db.items
    where i.AuctionID == 2 && i.Bids.Any(c=>c.CustomerID == (Int32?)1165)
    select new
    { i.ItemId,
      i.ItemName,
      i.Bids.Where(b=>b.CustomerID == (Int32?)1165 ).OrderbyDescending(b=>b.BidTime)
     }
    

    确保您对 sql 进行概要分析并确认您只获得了一个 sql 语句。如果没有,您需要将 LoadOptions 添加到您的数据上下文中(这将确保所有出价都急切地加载您的项目)。

    这个也将订购每件商品的出价(不确定你是否会这样做......但我猜你已经检查过了)。

    【讨论】:

    • 感谢普伦!我不得不进行一些编辑来修复匿名类型。假设我想要 BidTime 在每个项目中订购的投标是正确的。结果集有一个问题。它返回 Items 表中的每个 Item,并且只为 Items Customer 1165 出价填充 Bids IEnumerable。我希望退货集仅包含出价的 Items 1165。谢谢!
    • 顺便说一句:您不需要“from b in i.Bids” => 由于外键而已经存在并由 Linq2sql 处理
    • 实际上我试过了(没有'from bin i.Bids'),然后 Linq 找不到 CustomerID 或 BidTime(Bids 表中的两个字段)。我能够通过添加第二个“发件人”来解决这个问题。我同意你的观点,我认为由于 FK 我可以直接访问它,但它似乎不起作用。
    • 好吧,i.Bids 是一个集合(多个出价),因此它没有 customerID,因此您需要使用 .Any .First 等内容。
    猜你喜欢
    • 1970-01-01
    • 2013-05-23
    • 2010-12-03
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多