1

我得到错误 boolean Contains 不支持转换为 SQL

我有应该删除的房间 ID 数组

我想用这个查询删除,但我不能成功。我该怎么做?

var rooms = from rooms in entity.Rooms 
            where myArray.contains(rooms.RoomID) select rooms;
4

3 回答 3

1

您正在尝试混合通话。Array.Contains 发生在客户端上,但您将它放在发送到 sql server 的表达式的中间。

您需要将全部发送到 sql 进行比较,或者从 sql 返回行并在本地进行比较。

rooms = from room in entity.Rooms.AsEnumerable()
        where myArray.contains(room.RoomID)
        select room;

或使用 lambda 语法:

rooms = entity.Rooms.AsEnumerable.Where(room => myArray.contains(room.RoomID));
于 2012-06-02T11:55:56.643 回答
0
   var roomslist =myArray.ToList();
   var roomsTemp = entity.Rooms;
   var rooms=roomsTemp.Where(x=>roomslist.Contains(x.RoomId)).ToList();

如果这不起作用,那么这应该起作用,但我不建议使用它:

   var roomslist =myArray.ToList();
   var roomsTemp = entity.Rooms.ToList();
   var rooms=roomsTemp.Where(x=>roomslist.Contains(x.RoomId)).ToList();
于 2012-06-02T11:54:02.640 回答
0

自从 L2S 以来已经有一段时间了,但这里有。我可以发誓 int[].Contains 是内置的..您是否偶然使用 GUID?也许我在想EF。这有帮助吗:在 where 子句中使用 Array 进行 Linq 查询?

如果您要为此编写 SQL 过程,您将传入 ID 的 CSV 字符串。使用相同的想法(警告我的头顶):

var ids = "," + string.Join(",",myArray) + ",";
var rooms = from rooms in entity.Rooms 
        where SqlMethods.Like("," + rooms.RoomID + ",", ids) select rooms;

也许ids.Contains("," + rooms.RoomID + ",")会起作用,因为它具有内置 SQL 的翻译(用于字符串)

另一种方法是编写您自己的 UDF,将 CSV 分解为表格并执行SELECT EXISTS. 应该有很多这样的例子,因为这是您使用存储过程的方式。然后你可以:

var ids = "," + string.Join(",",myArray) + ",";
var rooms = from rooms in entity.Rooms 
        where MyMethods.Contains(ids,rooms.RoomID) select rooms;
于 2012-06-02T12:25:10.727 回答