2016-12-04 2 views
1

私はEntity Frameworkを介してオブジェクトをロードし、後で使用するためにそれを解決しない場合 - - たとえば等価フィルタでは、Entity Frameworkは、次のエラーをスロー値/値の組み合わせはMyTypeにあり、たとえば.Where(x => x.Name == MyTypeMemoryInstance.Name)です。Entity Frameworkの条件でメモリオブジェクトの等価比較を合理化する方法は?これは、簡単に識別を使用することによって解決することができる</p> <blockquote> <p>Unable to create a constant value of type 'MyType'. Only primitive types or enumeration types are supported in this context.</p> </blockquote> <p>:

しかし、代わりに.Where(x => x == MyTypeMemoryInstance)を行うことができるようにプリミティブ型を提供せずに同等性の比較を可能にする代替方法があるのだろうかと思っていましたが、メモリではなくSQLで引き続き行います。

概念的には、これは、特定の型に対して使用する特定のプリミティブ型の比較でLINQからSQLへの変換を提供でき、C#での通常の等価比較のオーバーライドと同様に解決できますが、これは実際に可能です。ありがとうございました。

答えて

1

ベスト

public class MyType 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public Func<MyType, bool> GetQuery() 
    { 
     // or whatever equals you would like 
     return x => x.Name == this.Name && x.Id == this.Id; 
    } 
} 

そして、例えば同じようにそれを使用します: - はい、私は、メモリ内の比較について知っているが、本当に代わりにSQL翻訳でこれを自動化したい

var first = ctx.MyTypes.First(); 
var listContainingLoadedThings = ctx.MyTypes.Where(first.GetQuery()).ToList(); 
0

問題はLinq to EntitiesクエリがSQLに変換されることです。 Linqプロバイダは、2つのオブジェクトインスタンスを変換してSQLで比較することはできません。そのため、SQLでのようにプリミティブ型で処理する必要があるため、その例外がスローされます。

1つの解決策は、拡張メソッドを使用して、LinqからEntities、Linq、Objectsに切り替えることができます。

var query=context.YourDbSet.AsEnumerable().Where(x => x== MyTypeMemoryInstance).... 

ただし、この解決策には注意してください。あなたはそのテーブルからメモリにすべての行をロードしようとしています。別の部分的な解決策は、あなたが複数の条件を持っているならば、あなたは最初にいくつかのフィルタを適用することができ、後であなたが本当にそうする必要がある場合は、インスタンスの比較を適用することができます:私は理由where句では、と考えることができます

var query=context.YourDbSet.Where(...).AsEnumerable().Where(x => x== MyTypeMemoryInstance).... 
+0

ありがとうございましたあなたはfuncはなり持っています。基本的には、LINQ to SQLプロバイダが等価比較のために使用するものを(IComparer、属性などを介して)認識できるようにして、等価比較式を解決するときに使用することを期待していました。 – Alex

+0

私はサーバレベルでは比較ができないのではないかと心配しています:(しかし、なぜ両方のオブジェクトの複数のプロパティをインスタンスと比較することができないのですか?これまでのところ、/sqlで比較されるオブジェクトインスタンスを変換する – octavioccl

関連する問題