我有一个字符串列表(从Guid转换而来),其中包含我想从表中提取的项目的ID。 然后,在我的LINQ查询中,我试图找出如何执行in子句来拉取该列表中的记录。 这是LINQ
var RegionRequests = (from r in db.course_requests
where PendingIdList.Contains(r.request_state.ToString())
select r).ToList();
它构建,但是我得到一个运行错误:“System.NotSupportedException:LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为商店表达式”。 我更愿意将guid与guid进行比较,但这让我无处可去。 这可以转换为lambda表达式吗?如果那是最好的,怎么样?
答案 0 :(得分:1)
LINQ to Entites尝试将您的表达式转换为SQL语句。您的服务器不知道存储过程ToString()
。
修正:
var regionRequests =
from r in db.course_requests.ToList()
where PendingIdList.Contains(r.request_state.ToString())
select r;
使用db.course_requests.ToList()
强制LINQ实现数据库数据(如果是大表,那将会有不好的时间)并且在对象上下文中执行ToString()
。
答案 1 :(得分:0)
你说:我有一个字符串列表(从Guid转换而来)......
你能不能将它们转换为字符串并将其保存为List<的System.Guid> ??然后你可以这样做(假设PendingIdGuidList是List< System.Guid>:
var regionRequets = (from r in db.course_requests
join p in PendingIdGuidList on u.request_state equals p
select r).ToList();
编辑添加:
我使用以下代码对此进行了测试:
var db = new EntityModels.MapleCreekEntities();
List<System.Guid> PendingIdGuidList =
new List<System.Guid>() {
System.Guid.Parse("77dfd79e-2d61-40b9-ac23-36eb53dc55bc"),
System.Guid.Parse("cd409b96-de92-4fd7-8870-aa42eb5b8751")
};
var regionRequets = (from r in db.Users
join p in PendingIdGuidList on r.Test equals p
select r).ToList();
用户是我数据库中的一个表。我添加了一个名为Test的列作为Uniqueidentifier数据类型,然后使用以下Guids修改了2个记录。
我知道这不是OP正在做的1:1,但非常接近。这是配置文件的SQL语句:
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[UserLogin] AS [UserLogin],
[Extent1].[Password] AS [Password],
[Extent1].[Test] AS [Test]
FROM [dbo].[Users] AS [Extent1]
INNER JOIN (SELECT
cast('77dfd79e-2d61-40b9-ac23-36eb53dc55bc' as uniqueidentifier) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
UNION ALL
SELECT
cast('cd409b96-de92-4fd7-8870-aa42eb5b8751' as uniqueidentifier) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable2]) AS [UnionAll1] ON [Extent1].[Test] = [UnionAll1].[C1]