我遇到了使用C#和lambdas創建IN子句的問題。C#lambda IN子句錯誤
我有以下方法GetUserList(string filtersByRoles)
可變string filtersByRoles
可以容納以逗號分隔的值,例如:「1,2」或「1,2,3」或「1,3,4」等..每個數字表示角色的唯一編號(換句話說,RoleId)。
然後我有下面的C#拉姆達查詢:
var query = _userRepository.GetUserList();
它返回一個IQueryable<User>
其中User
是從我的EntityFramework的表。
一旦我確認如果filtersByRoles
參數不是空或空的,我需要做的IN
條款如:
if (!string.IsNullOrEmpty(filtersByRoles))
{
//Convert *filtersByRoles* to an array of integers
int[] myArray = filtersByRoles.Split(',').Select(x => int.Parse(x)).ToArray();
//Make the IN clause
query = query.Where(u => myArray.Contains(u.RoleId));
}
上面的代碼編譯......但在運行時失敗與以下錯誤消息:
LINQ實體無法識別方法 '布爾 包含[的Int32](System.Collections.Generic.IEnumerable`1 [System.Int32], 的Int32)' 方法,和該方法不能被翻譯成st礦石 的表達。
我設法找到一個解決辦法,但它涉及到對的.ToList()
方法,我相信獲取所有從我的數據庫,然後將數據呼叫,增加了凡()子句。 但是,這不會打破目的或創造一些性能問題嗎?
這是我做了什麼:
if (!string.IsNullOrEmpty(filtersByRoles))
{
string[] myArray = filtersByRoles.Split(',');
query = query.ToList().Where(u => myArray.Contains(u.RoleId.ToString())).AsQueryable();
}
我寧願不使.ToList()
通話,避免提取的所有數據。
是否有另一種方法來實現這一目標?
編輯: 我正在使用實體框架1.0和.NET Framework 3。5
感謝 真誠
文斯
? –
廢話......對不起... ...框架3.5不是4.0 :-( – Vlince
錯誤是告訴你,linq優化器不知道如何翻譯包含在sql中的相應程序。我從來沒有試過這個,但(u => u.RoleId == myArray [0]).Where(u => u.RoleId == myArray [1])... –