LINQ查询(或lambda表达式)返回与列表匹配的记录

时间:2012-10-16 01:40:59

标签: linq lambda

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

2 个答案:

答案 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]