Web*_*uy2 1 c# linq asp.net-mvc entity-framework
正在开发 MVC5 应用程序。我有一个字符串数组定义为......
string[] myArray;
Run Code Online (Sandbox Code Playgroud)
里面有3个项目......
{string[3]}
[0]: "a411d1bc-21f7-4e4d-a4d3-4dd36e1b319f"
[1]: "ef4e3655-fa6f-4dfc-b2d4-178ac5914f0b"
[2]: "d75a98c5-a829-43c5-b2cf-d50be1189a05"
Run Code Online (Sandbox Code Playgroud)
这些实际上是 AspNetUser 表中记录的主键。我想使用多个“WHERE”中的数组项来执行 EF WHERE 子句。(所以基本上我想从 AspNetUser 表中检索这 3 个用户。)这是到目前为止我的代码......
IQueryable<Event> events = db.Events;
if (myArray != null)
{
events = events.Include(a => a.AspNetUser);
for(int i = 0; i <= myArray.Length-1; i++)
{
events = events.Where(u => u.AspNetUser.Id == myArray[i].ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
因此,正如您所看到的,我基本上是循环遍历数组(包含所有 PK)并在 WHERE 子句中使用它。
但是,当我点击循环中的第一行 .WHERE 时,我收到此错误:
LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”。
我在这里做错了什么?有更好的方法吗?
最后,对于我所描述的动态场景,如何使用 OR 语句而不是 AND 命令来表示 where?
在正常情况下,当在 EntityFramework 中执行类似 a 的操作时Where
,它实际上并不像操作可枚举对象(如列表)那样在内存中执行。相反,它转换为 SQL,然后由数据库提供者执行。这意味着执行某些操作(例如在对象上使用扩展方法,或者在您的情况下通过索引从数组获取元素)不是一个选项,因为转换器无法将此类操作转换为 SQL。
要修复现有代码,您需要修改 for 循环,如下所示:
for(int i = 0; i <= myArray.Length-1; i++)
{
var temp = myArray[i].ToString();
events = events.Where(u => u.AspNetUser.Id == temp);
}
Run Code Online (Sandbox Code Playgroud)
将数组操作移到查询之外允许 EntityFramework 将其正确转换为 SQL。
做你想做的事情的更好方法如下:
var result = events.Where(u => myArray.Contains(u.AspNetUser.Id));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2034 次 |
最近记录: |