C# 在此上下文中仅支持基元类型或枚举类型。Linq到SQL
我有一个表“Components”,其中包含列“AssemblyGuid”和“PartGuid”。 我有一个组件列表“组件指南” 如何进行Linq到Sql查询,通过复合键加载“componentsGuids”列表中的所有组件条目C# 在此上下文中仅支持基元类型或枚举类型。Linq到SQL,c#,entity-framework,linq-to-sql,C#,Entity Framework,Linq To Sql,我有一个表“Components”,其中包含列“AssemblyGuid”和“PartGuid”。 我有一个组件列表“组件指南” 如何进行Linq到Sql查询,通过复合键加载“componentsGuids”列表中的所有组件条目 var componentsDb = Context.Components//.ToList() an error occurs here .Where( x => componentsGuids.An
var componentsDb = Context.Components//.ToList() an error occurs here
.Where(
x => componentsGuids.Any(
y => y.AssemblyGuid == x.AssemblyGuid
&& y.PartGuid == x.PartGuid));
也许这能帮你找到解决办法。我不确定代码是否能像开箱即用的那样工作,但我希望它能让想法变得清晰。将两个guid合并到一个列表中,并使用
Contains
检查是否存在同样合并的guid对
类似的方法应该会奏效:
var componentsGuidsConcat = componentsGuid
.Select(p => AssemblyGuid.ToString() + PartGuid.ToString())
.ToList();
var componentsDb = Context.Components
.Where(p => componentsGuidsConcat.Contains(
p.AssemblyGuid.ToString() + p.PartGuid.ToString())
);
很抱歉,但您的代码引发异常。{“内部错误:已达到expression services限制。请在查询中查找可能复杂的表达式,并尝试简化它们。”}它不应是现成的工作代码示例。它应该给你一个如何解决问题的想法。我不明白你为什么会有这样的例外。查询非常复杂……您的代码运行良好。但是,如果componentsGuidsConcat包含1000多个元素,则会出现一个异常thrownYes,这是正确的。这是因为sql server的限制。在这种情况下,您可能应该选择客户端的所有(未过滤)数据,然后进行过滤。但是,你可能选择了很多数据,实际上你没有,这可能会使你的查询速度变慢
var componentsGuidsConcat = componentsGuid
.Select(p => AssemblyGuid.ToString() + PartGuid.ToString())
.ToList();
var componentsDb = Context.Components
.Where(p => componentsGuidsConcat.Contains(
p.AssemblyGuid.ToString() + p.PartGuid.ToString())
);