1

我有一个字符串列表(从 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 表达式吗?如果这是最好的,怎么做?

4

2 回答 2

2

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()在对象上下文中执行。

于 2012-10-16T08:39:54.183 回答
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 的列作为唯一标识符数据类型,然后使用以下 Guid 修改了 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]
于 2012-10-16T14:39:23.473 回答