因此,我试图从基于属性的集合中检索结果。我想得到在列表中保留该值的任何结果。
这是我的代码
我尝试使用动态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)
有什么办法可以做到这一点?
答案 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)