C# 使用Where中的Contains作为列表

C# 使用Where中的Contains作为列表,c#,sql,linq,entity-framework-core,dynamic-linq,C#,Sql,Linq,Entity Framework Core,Dynamic Linq,因此,我尝试从基于属性的集合中检索结果。我想得到任何在列表中保持该值的结果 这是我的密码 我试过使用dynamic linq。它不起作用了 这是动态林克。不起作用 var list = new List<string>(2) { "11111", "22222" }; accounts = accounts.Where("@0.Contains(outerIt.PartnerCompanyId)", list); 我还希望SQL生成如下内容 WHERE PartnerCompa

因此,我尝试从基于属性的集合中检索结果。我想得到任何在列表中保持该值的结果

这是我的密码

我试过使用dynamic linq。它不起作用了

这是动态林克。不起作用

var list = new List<string>(2) { "11111", "22222" };


accounts = accounts.Where("@0.Contains(outerIt.PartnerCompanyId)", list);
我还希望SQL生成如下内容

WHERE PartnerCompanyId IN (@gp1, @gp2, @gp3, …)
即使列表中有不止一个值,我也得到了这个结果。我希望参数列表中的元素数量相同

…WHERE PartnerCompanyId IN (@gp1)
有什么方法可以做到这一点吗?

这是正确的方法:

var myaccounts = accounts.Where(a =>list.Contains(a.PartnerCompanyId));

您可以将其作为一个文本案例来运行,以显示它的工作情况。

如果我正确理解了您的问题,您有一个帐户列表,您希望检查帐户是否包含“列表[0]或列表[1]或列表[2]”

我已经设法使用动态Linq实现了类似的功能

以您的代码为基础,以下是我为使查询正常工作所做的工作:

List<string> list = new List<string>(2) { "11111", "22222" };

string argumentString = "";

for (int i = 0; i < list.Length; i++)
{
    argumentString = argumentString + "@" + i;
    argumentString = argumentString + ".Contains(outerIt.PartnerCompanyId)";

    if (i != (list.Length - 1))
    {
        argumentString = argumentString + " or ";
    }
}

var accounts = accounts.Where(argumentString, list.ToArray());

循环将创建字符串:@0.ContainsouterIt.PartnerCompanyId或@1.ContainsouterIt.PartnerCompanyId

创建此字符串后,您只需要一个简单的Linq查询来检查列表中的所有项目

注意:可以通过和数组按顺序引用参数,但不能引用列表。如图所示

我希望这能有所帮助,我有一个类似的项目,我花了很长时间才弄明白。您可以直接使用,但请确保您搜索的值中的类型和类型相同

因此,只有当PartnerCompanyId也是字符串时,这才有效

var list=newlist2{1111122222}; 账户Where@0.ContainsouterIt.PartnerCompanyId,名单

在LinqPad中测试这一点会显示您所期望的SQL: -区域参数 声明@p0int=7065 声明@p1 Int=7066 -端区 从[MyTable]中选择[t0]。[Id],***作为[t0] 其中,@p0,@p1中的[t0].[Id]

accounts=accounts.Whereaccount=>list.Containsaccount.PartnerCompanyId;问题是我得到了这个…在gp1中PartnerCompanyId。我期望生成的更像这样…gp1、gp2中的PartnerCompanyId,…仅供参考,其中=>a.PartnerCompanyId.Containslist.Any.ToString将搜索任何包含子字符串true的PartnerCompanyId,因为list.Any.ToString将计算为true,因为list不是空的。搜索我找到的表达式树是否有帮助?什么版本的EF Core?
List<string> list = new List<string>(2) { "11111", "22222" };

string argumentString = "";

for (int i = 0; i < list.Length; i++)
{
    argumentString = argumentString + "@" + i;
    argumentString = argumentString + ".Contains(outerIt.PartnerCompanyId)";

    if (i != (list.Length - 1))
    {
        argumentString = argumentString + " or ";
    }
}

var accounts = accounts.Where(argumentString, list.ToArray());