Linq,array.Contains()生成异常:在此上下文中仅支持基本类型(例如Int32,String和Guid')

时间:2012-08-21 00:13:43

标签: c# entity-framework linq

我正在尝试使用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不会支持它。 我理解正确吗?

2 个答案:

答案 0 :(得分:3)

实体框架仅在EF 4.0中开始支持Contains对阵列。您可以work around this in older versions构建Expression以包含OR条件列表。

  

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

检查System.Data.Entity程序集的版本。有关详细信息,请参阅this other question

答案 1 :(得分: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();

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