Linq To Sql Contains 参数数量最大不能超过 2100 怎么解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linq To Sql Contains 参数数量最大不能超过 2100 怎么解决?相关的知识,希望对你有一定的参考价值。

var names = dataLst.Select(item => item.Name);

var count = db.InvoiceContracts.Where(item => names.Contains(item.Name)).Count();

dataLst 是本地生成的一个结果集.所以不能用join来联合。



var names = dataLst.Select(item => item.Name);

改为

var names = dataLst.Select(item => item.Name).AsEnumerable();

的方法是不行的.

希望有大虾 提供有效的解决方案.

参考技术A 分少点!回头入我团队帮我打工偿还呀!O(∩_∩)O哈哈~
---------
你根本不是级联的问题,而是要保持Contains方法功能的特殊性,它有模糊匹配的功能!
------
第一种方式:轻装上阵,小集合拼合!
var names = dataLst.Select(item => item.Name).Skip(1000).Take(1000);
一千一次
形成多集合合并
do while--1000条目累加一次!
cs+=db.InvoiceContracts.Where(item => names.Contains(item.Name)).Count()
-----
第二种:采用原始sql,这个比较实在。速度也较为理想。
第三种:
int csum=zero;// int csum=0;
foreach (var item in names)

csum+= (from c in db.InvoiceContracts
where SqlMethods.Like(c.Name, "%"+item+"%")
select c).Count();


-----------------
因为本人写的东西说代码不是代码也不能运行,说伪码还有代码,应该一看就明白。可能不能运行,自己多调试,思路都有了!追问

高手帮帮忙!

rs = from item in rs
join ci in db.CustomerInfos
on item.Signer equals ci.User
where ci.Type == query.CustomerType//定值
select item;
这样设置关联的话 当customer表中存在 相同user的两条记录的时候
我的结果集 就会多出一条重复的记录..因为这个生成的 INNER JOIN
怎么样去写 才能避免这种情况啊?
我不需要Customer里的任何数据.只是用它做中转 来设置查询条件.

追答

第一:除重。
(from item in rs
join ci in db.CustomerInfos
on item.Signer equals ci.User
where ci.Type == query.CustomerType//定值
select item).Distinct();
第二:过滤
对条件进行过滤,只取其一即可!
第三:即使重复
那是否影响最终结果集呢,不影响重复就重复呗!

本回答被提问者采纳
参考技术B 0 0~ 多用几次不就好了么~

LINQ to SQL查找以另一个表中的字符开头的值

我想从SQL表中检索值列表,其中记录以另一个表中定义的前缀开头。

This post给出了一个准确的答案,但它适用于EF而不是Linq to SQL。使用SQL我收到一个错误:

String.Contains方法仅支持可在客户端上计算的参数

示例代码:

var lookupList = dc.LookupTable.Select(p => p.Prefix);
var q = dc.Personnel
          .Where(item => lookupList
          .Any(p => item.Surname.StartsWith(p))).Select(x => x.PersonID);

这适用于EF。是的,我可以ToList()我的集合,但表很大,查询变得非常慢。有关如何使其工作而不枚举我的对象的任何建议?

答案

这部分:.Any(p => item.Surname.StartsWith(p))给出错误:

String.Contains方法仅支持可在客户端上计算的参数

它告诉您Contains方法不能使用给定的参数,该参数只能在服务器上进行评估。 StartsWith基本上使用相同的机制。因此,您应该使用Contains来确定包含参数是否在开头出现,而不是StartsWithIndexOf

.Any(p => item.Surname.IndexOf(p) == 0)

根据MSDN:

的IndexOf(T):

项目索引如果在列表中找到;否则,-1。

这个答案部分取自here

以上是关于Linq To Sql Contains 参数数量最大不能超过 2100 怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章

LINQ体验——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains

在 LINQ to SQL 中使用 contains()

LINQ to SQL语句之Exists/In/Any/All/Contains

本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Contains() 运算符除外

LINQ to SQL查找以另一个表中的字符开头的值

Linq to sql之left join运用示例