C# LINQ包含()个可选项

C# LINQ包含()个可选项,c#,.net,entity-framework,linq,C#,.net,Entity Framework,Linq,我有一个int列表,我需要从我的查询中选择所有记录,其中id包含在第二个列表中,如下所示: //my list of ids var ids=[myquery].select(x=> x.id) query = query.Where(x => ids.Contains(x.Id)); 现在,LINQ将在以下格式中转换上述内容: SELECT * FROM [MyTable] WHERE ([x].[id] IN (108,687, 689, 691,

我有一个
int
列表,我需要从我的查询中选择所有记录,其中id包含在第二个列表中,如下所示:

     //my list of ids
    var ids=[myquery].select(x=> x.id)

    query = query.Where(x => ids.Contains(x.Id));
现在,LINQ将在以下格式中转换上述内容:

SELECT *
FROM [MyTable] 
WHERE ([x].[id] IN (108,687, 689, 691, 694, 705, 703,.....)
现在ids列表将增长很多,我想这将破坏性能


考虑到
ids
列表将包含超过200K项,有什么更好的解决方案呢?

我建议创建一个存储过程,如下所示:

  • C#和数据库之间没有不必要的调用(例如,您正在收集这些200K
    id
  • C#中的代码更少。所以你的代码会越来越清晰
  • 性能更好,因为有时EF会生成低效的SQL代码
所以看起来是这样的:

var user = "johndoe";

var blogs = context.Blogs
    .FromSqlRaw("EXECUTE dbo.GetMostPopularBlogsForUser {0}", user)
    .ToList();
如果项目少于
200K
,则尝试使用
不在
运算符中:

query = query.Where(x => !ids.Contains(x.Id));
SQL:


这取决于您的模型,但您可能应该使用导航属性

考虑到您目前有以下情况:

var user = "johndoe";

var blogs = context.Blogs
    .FromSqlRaw("EXECUTE dbo.GetMostPopularBlogsForUser {0}", user)
    .ToList();
var-id=
上下文
.实体1
.Where(x=>x.Property==value)
.选择(x=>x.ID)
.ToHashSet();
var项目=
上下文
.实体2
.其中(x=>ids.Contains(x.ID))
.ToList();
写下如下内容:

var项=
上下文
.实体2
.Where(x=>x.Entity1.Property==value)
.ToList();

您可能需要将此类关联添加到您的模型中,然后才能执行此操作。

您可能应该使用导航属性,但这取决于
[myquery]
query
是什么。您需要以某种方式发送这些200K项。Linq转换为这样的IN(…)是可以的。我也有同样的需求,只是我的ID列表作为逗号分隔的列表(字符串)有一点不同。我最终创建了一个CLR函数(MS SQL Server)。