C# Linq,array.Contains()生成异常:在此上下文中仅支持基本类型(';如Int32、String和Guid';)
我正在尝试使用Linq执行查询,这是我的新手。 我想接收一个ID数组,并用这些ID检索产品。我得到的linq查询是:C# Linq,array.Contains()生成异常:在此上下文中仅支持基本类型(';如Int32、String和Guid';),c#,entity-framework,linq,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))
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、字符串和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不支持它。
我理解正确吗?实体框架仅开始支持EF 4.0中针对数组的
Contains
。您可以通过构建一个表达式
来包含或条件列表
ps:我如何知道我使用的是哪个EF版本
检查
System.Data.Entity
程序集的版本。有关详细信息,请参阅。假设PricingForepository
是您的对象上下文或返回相关对象集的存储库类,这可能会起作用(这是查询的方法语法版本,稍作调整):
您正在对
int
s数组调用Contains()
,LINQ将其视为IEnumerable
,这应该可以。我以前使用过类似的查询,没有任何问题…@pst是的-但是文本指定了“哪个EF版本”-不确定。@pst我相信这是EF 1错误消息,而L2Q有不同的错误IIRC@ReedCopsey系统数据实体v4.0.30319。我应该能够执行ids.Contains()操作,对吗?有语法错误吗?@Oscar没有-你所拥有的应该可以工作,但正如你所看到的,它不能是null
。这是真的。这是一个新手的错误,但也许错误信息可以更具体一些。感谢您的帮助如果EF而不是L2S,请重新标记:它们是两种不同的产品。如果是EF,请包括引用的程序集的版本号。(查看引用程序集的属性。)@pst请验证编辑,我应该如何继续?刚刚发现。。。由于某种原因,ids为null,这是导致错误的原因
var query = pricingInfoRepository.Table
.Where(pi => pi.Active && ids.Contains(pi.Id))
.Select(pi => new PricingInfo
{
ProductId = pi.Id,
CurrentPrice = pi.CurrentPrice
})
.ToArray();