11

最近、「インターフェイス メンバー ..... のマッピングはサポートされていません」というエラーが発生しましたが、このスレッドに基づいて解決しました。デモンストレーションするには:

public interface IMyInterface { string valueText { get; set; } }
public class MyData : IMyInterface
{
   int ID { get; set;}
   string valueText { get; set;}
}
public class MyOtherData : IMyInterface
{
   long ID { get; set;}
   string valueText { get; set;}
}

public static IEnumerable<T> GetByValue<T>(string value) : where T : class, IMyInterface, new()
{ 
   using (var context = new DataContext())
   { 
      // The important line
      return context.GetTable<T>().Where(x => x.valueText == value);
   }
}

このコードを実行すると、「インターフェイス メンバー IMyInterface.valueText のマッピングはサポートされていません」という NotSupportedException が発生します。ただし、 を に置き換えるx.valueText == valuex.valueText.Equals(value)、これは完全に期待どおりに機能します。

コードでこれを解決しましたが、なぜこのように動作するのかを理解したいです。誰でも説明できますか?

更新:以下の私のコメントによると、LINQ to SQL チームはこれを「修正しない」として終了しました。これは、既知のバグとしてカウントされるようになったことを意味すると思いますが、すぐには解決されません。ただし、そもそもなぜ動作が異なるのかを知りたいと思います。

4

1 に答える 1

2

どうやらクエリを上流のサーバーにプッシュするという決定は、不完全な一連のルールに基づいて行われ、LINQ-to-SQL は処理できない構造 (インターフェイス) を見つけます。

メソッド呼び出しは LINQ-to-SQL でサポートされていないため、クエリを生成してすべてのレコードを取得し、LINQ-to-Objects を使用してそれらをフィルター処理します。(実際には、他のスレッドに基づいて、LINQ-to-SQL は特別な例外を作成し、object.Equalsそれを SQL に変換する方法を知っている場合があります)。

インターフェイスが関係している場合、LINQ-to-SQL はおそらく LINQ-to-Objects の動作にフォールバックする必要がありますが、代わりに例外がスローされるようです。

于 2012-04-11T22:35:36.867 に答える