向此 LINQ 查询添加联接



所以在感觉像很多头撞之后,我有这个查询:

var widgets = db.Updates
      .Where(c => c.Sold.Equals(false))
      .GroupBy(c => c.widgetType)       
  .Select(x => x.OrderByDescending(y => y.TimeStamp).First()).ToList();
   widgetGrid.DataSource = widgets;
   widgetGrid.DataBind();

现在我已经拥有了所有出售的小部件,我需要添加一个连接,例如,假设我想在所有者中的 ID 上加入"所有者"表等于小部件中的 ID,然后选择 Owner.Name 和 Widget.Style

对于我的生活,我似乎无处可去......任何人?

一如既往...我非常感谢任何人花时间帮助我清理蜘蛛网。

如果我理解正确,您有两个序列:

  • 小组件序列,其中每个小组件都有一个属性 ID。
  • 您有一系列所有者,其中每个所有者都有一个媒体资源 ID

并且您需要具有匹配 ID 的序列和所有者的组合。

顺便说一下,可能你的小部件会有一个 ownerId,或者你的所有者会有一个 widgetId,但这不会影响解决方案。

连接将如下所示:

var joinedTable = widgets.join(owners,  // join table widgets with table owners
    w => w.Id                 // from widgets take the Id
    o => o.Id                 // from owners also take the Id
    (widget, owner) => new    // where those Ids match, take the owner and the widget
    {                         // and take the properties you want
        Id = widget.Id,
        MyXProperty = owner.X,
        MyYProperty = widget.Y,
        Widget = widget,      // or take the complete widget and owner
        Owner = owner,
    }); 

顺便说一句,你写"现在我有所有售出的小部件"。从您的代码段中,我知道每个更新都有一个布尔属性已售出,并且您希望所有更新都位于 !出售。我假设你最终得到的物品没有售出?

您的谓词在 where 子句中的优势是什么。为什么不是:

var widgets = db.Updates.Where(c => !c.Sold)
    .GroupBy // etc.
你可以

这样做:

var widgets = db.Updates
      .Where(c => !c.Sold)
      .GroupBy(c => c.widgetType)       
      .Select(x => x.OrderByDescending(y => y.TimeStamp).FirstOrDefault());
var result= (from w in widgets
             join o in db.Owners on w.OwnerId equals o.Id
             select new {o.Name, w.Style}).ToList();

您也可以尝试:

var widgets = db.Updates
      .Where(c => c.Sold.Equals(false))
      .GroupBy(c => c.widgetType)       
      .Select(x => x.OrderByDescending(y => y.TimeStamp).First())
      .Join( db.Owners,
             u => u.ID,
             o => o.ID,
             (u, o) => new { o.Name, u.Style }).ToList();

相关内容

  • 没有找到相关文章

最新更新