使用清单中的包含

时间:2019-07-18 17:35:47

标签: c# sql linq entity-framework-core dynamic-linq

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

这是我的代码

我尝试使用动态linq。它不起作用

这是动态linq。无效

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


accounts = accounts.Where("@0.Contains(outerIt.PartnerCompanyId)", list);

这不能正常工作

accounts = accounts .Where(a =>
               a.PartnerCompanyId.Contains(list.Any().ToString()));

我还希望SQL生成类似这样的内容

WHERE PartnerCompanyId IN (@gp1, @gp2, @gp3, …)

即使列表中有多个值,我也一直在获取它。我希望参数列表中的元素数相同。

…WHERE PartnerCompanyId IN (@gp1)

有什么办法可以做到这一点?

3 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则您有一个帐户列表,并且想要检查帐户是否包含“列表[0]或列表[1]或列表[2] ...”。

我设法使用Dynamic 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.Contains(outerIt.PartnerCompanyId)或@ 1.Contains(outerIt.PartnerCompanyId)”

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

注意:您可以通过and数组顺序引用参数,但不能引用列表。如此处https://stackoverflow.com/a/40885380/10253157所示。

我希望这会有所帮助,我有一个类似的项目,花了我一段时间才弄清楚。

答案 1 :(得分:0)

这是正确的方法:

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

您可以看到它是一个文本案例,可以运行以证明其运作here

答案 2 :(得分:0)

您可以仅使用Dynamic Linq,但请确保搜索值的类型和类型相同。

因此,只有在PartnerCompanyId也是字符串的情况下,这才起作用。

var list = new List<string>(2) { "11111", "22222" }; accounts.Where("@0.Contains(outerIt.PartnerCompanyId)", list);

在LinqPad中进行测试可以显示您期望的SQL: -- Region Parameters DECLARE @p0 Int = 7065 DECLARE @p1 Int = 7066 -- EndRegion SELECT [t0].[Id], *** FROM [MyTable] AS [t0] WHERE [t0].[Id] IN (@p0, @p1)