3

我正在尝试使用 Linq 执行查询,这是我的新手。我想接收一组 ID 并检索具有这些 ID 的产品。我得到的 linq 查询是这个:

    public Product[] RetrieveProduct(int[] ids)
    {
        var query = from productInfos in productRepository.Table
                    where (ids.Contains(productInfos.Id))
                    && productInfos.Active
                    select new ProductIndiInfo
                    {
                        ProductId = productInfos.Id,
                        CurrentPrice = productInfos.CurrentPrice
                    };
        return query.ToArray();
    }

但我不断收到著名的例外:

{"无法创建类型为 'System.Int32[]' 的常量值。在此上下文中仅支持原始类型('例如 Int32、String 和 Guid')。"}

我读过的一些资源说它不可用。但其他一些人告诉我它应该工作。我在这里和博客等中看到了许多带有替代方案的帖子,但它不起作用。我开始认为这是一个语法问题......

我也尝试过这种方法:

 var query = from productInfos in pricingInfoRepository.Table
                    where ids.Any(id => id == productInfos.ProductId)
                    && productInfos.Active
                    select new PricingInfo
                    {
                        ProductId = productInfos.Id,
                        CurrentPrice = productInfos.CurrentPrice
                    };
        return query.ToArray();

但我遇到了同样的问题。

有人可以告诉我我的语法是错误的还是真的是 Linq 问题?(不支持操作?)

如何找出我正在使用的 EF 版本?

更新:据我了解,这个关于 ids.Contains() 的问题将是一个 L2S 问题,但可能的答案是 EF2 不支持它。我理解正确吗?

4

2 回答 2

3

实体框架Contains在 EF 4.0 中才开始支持数组。您可以在旧版本中通过构建Expression包含 OR 条件列表来解决此问题。

ps:如何知道我使用的是哪个EF版本?

检查System.Data.Entity程序集的版本。有关详细信息,请参阅其他问题

于 2012-08-21T00:22:15.060 回答
1

假设这pricingInfoRepository是您的对象上下文或返回相关对象集的存储库类,这可能有效(这是您查询的方法语法版本,稍作调整):

 var query = pricingInfoRepository.Table
            .Where(pi => pi.Active && ids.Contains(pi.Id))
            .Select(pi => new PricingInfo
            {
                ProductId = pi.Id,
                CurrentPrice = pi.CurrentPrice
            })
            .ToArray();

您正在调用sContains()的数组int,LINQ 将其视为IEnumerable,这应该没问题。我之前使用过类似的查询,没有任何问题......

于 2012-08-21T03:16:00.263 回答