在專案中曾有這樣的應用,許可權篩選時先組織出員工的id,然後使用linq在相應的表中查詢資料,條件是這些查詢出來的資料的id必須在剛才許可權篩選出來的id中,但是如果許可權中的id太多,就會出現問題「傳入的**格式資料流(tds)遠端過程呼叫(rpc)協議流不正確。此 rpc 請求中提供了過多的引數。最多應為 2100」。我推斷可能是sqlserver中使用引數不能超過2100的原因。以上描述請看下邊的例子。
intinputlist
=new
int[
2100
];for
(inti =
0; i
<
inputlist.length; i++)
dataclasses1datacontext dc
=new
dataclasses1datacontext();
var t
=(from x
indc.test1
select x).where(c
=>
inputlist.contains(c.testid));
dc.log
=console.out;
foreach
(var item
int)
執行以上**會報「傳入的**格式資料流(tds)遠端過程呼叫(rpc)協議流不正確。此 rpc 請求中提供了過多的引數。最多應為 2100」異常,如果將inputlist陣列大小改為5,執行的sql如下:
select [t0].[testid], [t0].[testcontent], [t0].[p]
from [dbo].[test1] as [t0]
where [t0].[testid] in (@p0, @p1, @p2, @p3, @p4)
現在問題是如果超過2100個引數怎麼辦,我沒想出用linq實現的好辦法,這裡使用了乙個折中的辦法
public
static
list
<
t>
test
<
t>
()else")
");}}
sqlcommand cmd
=new
sqlcommand(sqlstr.tostring(), (sqlconnection)dc.connection);
dc.connection.open();
sqldatareader dr
=cmd.executereader();
list
<
t>t =
dc.translate
<
t>
(dr).tolist();
returnt;}
static
void
main(
string
args)
}
這裡利用了反射得到表名,然後利用linq中的translate方法將sqldatareader轉換成相應的類。
8月11日更新:
如果inputlist不是乙個陣列而是乙個iqueryable,直接用就沒什麼問題
var tt
=(from x
indc.test
select x.testid);
var t
=from x
indc.log
where
tt.contains
<
int?>
(x.logid)
select x;
dc.log
=console.out;
foreach
(var item
int)
拼接出的sql語句如下:
select [t0].[logid], [t0].[logmessage], [t0].[x]
from [dbo].[log] as [t0]
where exists(
select null as [empty]
from [dbo].[test] as [t1]
where [t1].[testid] = ([t0].[logid]))
LINQ引數過多時的解決方案
在專案中曾有這樣的應用,許可權篩選時先組織出員工的id,然後使用linq在相應的表中查詢資料,條件是這些查詢出來的資料的id必須在剛才許可權篩選出來的id中,但是如果許可權中的id太多,就會出現問題 傳入的 格式資料流 tds 遠端過程呼叫 rpc 協議流不正確。此 rpc 請求中提供了過多的引數。...
編譯報錯,方法數過多解決方案
在android官方api中給出了這個問題的解決方案 配置方法數超過 64k 的應用 讓你完美的規避64k的限制。1.minsdkversion 21,只需要在build.gradle中設定multidexenabled為trueandroid 2.minsdkversion 21,進行如下操作 呼...
LinQ中為null的判斷解決方案
先看部門表設計和資料 注意 pid為父部門的id號,如果是頂級部門則沒有pid pid為null 如果要查詢為null的pid,我們知道sql語句應該是 select from depart where pid is null 很多人用linq寫成 code int?pid null listdep...