【发布时间】:2011-07-29 15:01:37
【问题描述】:
我在使用 C# 和 lambdas 创建 IN 子句时遇到问题。
我有以下方法GetUserList(string filtersByRoles)
变量string filtersByRoles 可以保存逗号分隔的值,例如:“1,2”或“1,2,3”或“1,3,4”等...每个数字代表唯一的数字一个角色(也就是 RoleId)。
然后我有以下 C# lambda 查询:
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));
}
上面的代码可以编译...但是在 RUNTIME 它失败并显示以下错误消息:
LINQ to Entities 无法识别“Boolean”方法 包含[Int32](System.Collections.Generic.IEnumerable`1[System.Int32], int32)' 方法,并且这个方法不能翻译成store 表达。
我设法找到了解决方法,但它涉及到调用 .ToList() 方法,我相信该方法会从我的数据库中获取所有数据,然后添加 Where() 子句。
但这不会破坏目的或产生一些性能问题吗?
这就是我所做的:
if (!string.IsNullOrEmpty(filtersByRoles))
{
string[] myArray = filtersByRoles.Split(',');
query = query.ToList().Where(u => myArray.Contains(u.RoleId.ToString())).AsQueryable();
}
我希望不调用.ToList() 并避免获取所有数据。
还有其他方法可以实现吗?
编辑: 我正在使用 Entity Framework 1.0 和 .NET Framework 3.5
谢谢 真诚的
文斯
【问题讨论】:
-
您使用的是什么版本的 .NET?
-
废话...抱歉...框架 3.5 不是 4.0 :-(
-
错误告诉你linq优化器不知道如何将Contains翻译成sql中的相应过程。我从来没有尝试过,但你能建立多个 Where's 并将它们链接在一起吗?比如 .Where( u=> u.RoleId == myArray[0] ).Where( u => u.RoleId == myArray[1]) ...
-
现在离开办公室......但会在周末尝试一下,谢谢 Brian!
标签: c# linq entity-framework lambda