我有两个类型的表达式,Expression<Func<T, bool>>我想采取OR,AND或NOT这些并得到一个相同类型的新表达式
Expression<Func<T, bool>> expr1;
Expression<Func<T, bool>> expr2;
...
//how to do this (the code below will obviously not work)
Expression<Func<T, bool>> andExpression = expr AND expr2
Run Code Online (Sandbox Code Playgroud) from f in CUSTOMERS
where depts.Contains(f.DEPT_ID)
select f.NAME
Run Code Online (Sandbox Code Playgroud)
depts是IEnumerable<int>部门ID 的列表()
这个查询工作正常,直到你传递一个大的列表(比如大约3000 dept ids)..然后我得到这个错误:
传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确.此RPC请求中提供的参数太多.最高为2100.
我将查询更改为:
var dept_ids = string.Join(" ", depts.ToStringArray());
from f in CUSTOMERS
where dept_ids.IndexOf(Convert.ToString(f.DEPT_id)) != -1
select f.NAME
Run Code Online (Sandbox Code Playgroud)
使用IndexOf()修复错误但使查询变慢.有没有其他方法可以解决这个问题?非常感谢.
有一段时间我会尝试使用LINQ.枚举集合并在我的代码中更改其某些属性的典型方法如下所示:
ATDataContext dc = new ATDataContext(Settings.connection_string);
int[] col = ListViewClass.getListViewSelectedPositionTags(listView);
try
{
foreach (var item in col)
{
var ctx = (from r in dc.MailingLists
where r.ID == item
select r).Single();
ctx.Excluded = 'Y';
ctx.ExcludedComments = reason;
}
dc.SubmitChanges();
}
Run Code Online (Sandbox Code Playgroud)
有一段时间有一个建议来做到这一点...似乎更聪明的方式:
var ctx = from r in dc.MailingLists
where col.Contains(r.ID)
select r;
foreach (var item in ctx)
{
item.Excluded = 'Y';
item.ExcludedComments = reason;
}
dc.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)
Iit在很多层面上都很有意义,我喜欢这个解决方案.它比第一个更聪明,更快捷.
我已经在生产环境中使用了这个解决方案一段时间了.
几周后,我在搜索应用程序日志文件时看到了什么,并看到了这一点:
"传入的表格数据流(TDS)远程过程调用(RPC)协议流不正确.此RCP请求中提供的参数太多.最大值为2100."
LINQ to SQL转换where col.Contains(r.ID)为IN子句看起来像:
WHERE ID …
在我正在进行的项目中,我需要以下列方式访问LINQ中的2个数据库:
我得到了DB1指定日期范围之间所有旅行号码的列表,并将其存储为"长"值列表
我在DB2上执行了大量连接的大量查询,但只查看了上面列表中包含其行程编号的行程.
问题是,来自DB1的行程列表经常返回超过2100项 - 我当然在SQL中达到2100参数限制,这导致我的第二个查询失败.我一直在寻找解决这个问题的方法,例如此处所描述的,但是这实际上将我的查询更改为LINQ-to-Objects,这会导致我的连接出现很多问题
我还能做其他解决方法吗?
我有兴趣学习:
Select * from Customer where CustomerId in(12,23,45);
Run Code Online (Sandbox Code Playgroud)
同样,上面有相同的C#.Net关键字吗?
示例:验证日期(月)不在十月,十一月十二月(不在SQL或LINQ中)
我用扩展方法(三元运算符和||通过用月验证)做到了我正在寻找简单的方法来验证,如果存在的话.
c# ×5
linq ×4
linq-to-sql ×2
parameters ×2
.net ×1
expression ×1
lambda ×1
limit ×1
sql ×1
sql-server ×1