6

Entity Framework を使用して、このような 2 つのテーブルを結合しようとしています。

...
join f in ent.FTypes on Int32.Parse(c.CourseID[0].ToString()) equals f.FTypeID
...

文字列 CourseID の最初の文字は数字で、FTypeID は int です。

しかし、これはうまくいかないようです。私が受け取る例外メッセージは次のとおりです。

LINQ to Entities はメソッド 'Int32 Parse(System.String)' メソッドを認識せず、このメソッドはストア式に変換できません。"} System.Exception {System.NotSupportedException}

複製したいのは、同等の SQL 文字列です (正常に動作します)。

join FType f on SUBSTRING(c.CourseID, 1, 1) = f.FTypeID

LINQ to Entities でこれを行う必要がある解決策はありますか?

4

2 に答える 2

0

これが 8 年前に機能したかどうかはわかりませんが、最新のEF6実装では匿名型を追加できるため、最初の選択ステートメントに変換を追加してから、その新しいプロパティを結合で直接比較できます。

    from c in ent.Courses
    select new { typeId = c.CourseId.Substring(0, 1), c }
    join f in ent.FTypes.Select(t => new { stringId = 
    t.FTypeId.ToString(), t }
    on c.typeId equals f.stringId into ...

注:結合ステートメントは ToString() をサポートしていないように見えますが、選択ステートメントはサポートしています。

CouresId.Substring を結合ステートメントに移動することもできますが、そこでは効率が低下する可能性があります。

SQL は次のようになります。

INNER JOIN [ent].[FTypes] AS [Extent2] ON 
(LTRIM(RTRIM(SUBSTRING([Extent1].[nvarchar(max)], 3 + 1, 1)))) =  
CAST([Extent2].[Id] AS nvarchar(max))
于 2021-06-17T18:03:38.593 に答える