【问题标题】:Join Collection of Objects with LINQ to SQL使用 LINQ to SQL 加入对象集合
【发布时间】:2010-12-03 10:17:31
【问题描述】:

这甚至可能吗?看来我应该可以。

这是我的问题。我需要从第 3 方运行 Web 服务方法,以获取需要 ID 和 Status 属性的可用项目的集合。然后我有使用 LINQ to SQL 检索当前项目的方法。

我需要做的是检索当前可用的项目。我可以通过 ID 连接它们,但我还需要从 Web 服务方法返回的状态。

理想情况下,我的最终结果将与 LINQ to SQL 方法加上 Web 服务方法的 Status 属性的结果相同。

我们将不胜感激。谢谢!

下面是我想做的。有一个方法可以从 Web 服务中获取对象列表并加入现有查询。

public List<Items> GetItems(List<AvailableItems> availList)
{
            var result = (from c in dataContext.items
                          where c.status == "current"
                         select c;

             return result;
}

【问题讨论】:

    标签: sql linq collections


    【解决方案1】:
    public List<Item> GetItems(List<AvailableItems> availList)
    {
        var result = (from c in dataContext.items.AsEnumerable())
                      join a in availList on a.id equals c.id
                      where c.status == "current"
                      select c;             
    
        return result.ToList();
    }
    

    【讨论】:

    • 我似乎无法访问 a 中的属性。它不会出现在智能感知中。有什么需要做的吗?
    • 使用 .AsEnumerable() 会稍微便宜一些——它允许 LINQ to SQL 运行查询而无需预先遍历结果,但它通常不会产生太大影响。
    • @nitzmahone - 如果您不预先遍历结果,LINQ to SQL 是否会为每次连接迭代返回数据库?
    • 谢谢我最终使用了 AsEnumerable 建议,它就像一个魅力。
    • 我会在使用 Linq-to-objects 之前过滤掉 (c.status == "current"),因为它可能会减少工作量。
    【解决方案2】:

    重新编辑:

    我通常将 id 提取为查找列表,然后执行以下操作:

    public List<Items> GetItems(List<AvailableItems> availList)
    {
      var availableItemIds = availList.Select(a => a.Id).ToList();
      var items = (from item in dataContext.items
                   where availableItemIds.Contains(item.Id)
                   where item.status == "current"
    
      return items;
    }
    

    【讨论】:

    • 如果没有告诉 LINQ to SQL 实现查询的“障碍”,这将无法工作(请参阅下面贾斯汀的解决方案 - “ToList”是关键)。
    • 您还必须记住将返回类型从 List 更改为 var,因为您现在返回的是一个新的匿名类型。
    • var 是否作为返回类型工作?如果它可以从方法体中进行推断输入,那就太聪明了:-)
    • 它必须是 var 因为他返回一个匿名类型的 IEnumerable
    • @Stephan,我知道了。我只是以前没有见过这种结构,并且对编译器支持这一点感到惊讶。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多