1

テーブルから取得したい項目の ID を含む文字列 (Guid から変換) のリストがあります。次に、私の 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 を比較したいのですが、それではどうにもなりません。これをラムダ式に変換できますか? それが最善の場合、どのように?

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 という列を Uniqueidentifier データ型として追加し、次の 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 に答える