6

私はEFを使用しており、いくつかのクエリがあります。これが私のコードです

IEnumerable<Customer> customers = from c in context.Customers 
    select new Customer
    {
        ID = c.ID,
        Name = c.Name,
        LastName = c.LastName,
        DepID = c.DepID,
        Editable = SomeStruct.Check(c.DepID)
    }

public struct SomeStruct
{
    public static bool Check(int depID)
    {
        //Here I have some logic
    }
}

それは正常に動作します。SomeStructただし、 asと宣言classすると失敗します。

私の質問は次のとおりです。

  1. なぜそれが起こるのですか?
  2. 静的関数を使用すると、クエリが強制的に実行されますか?
4

3 に答える 3

6

コード内でメソッドSomeStruct.Check(c.DepID)を SQL クエリに変換する必要があります。これは、クラス/構造体などでの動作について説明しています。これは、クラスと構造体にこのようなメソッドがある Entity Framework の動作が異なるためです。ただし、クライアントでこのチェックを実行できます。

IEnumerable<Customer> customers = from c in context.Customers 
    select new
    {
        ID = c.ID,
        Name = c.Name,
        LastName = c.LastName,
        DepID = c.DepID
    }
    .AsEnumerable()
    .Select(d => new Customer
    {
        ID = c.ID,
        Name = c.Name,
        LastName = c.LastName,
        DepID = c.DepID,
        Editable = SomeStruct.Check(c.DepID)
    });

Editableまたは、プロパティを読み取り専用プロパティとして設定できます。

public class Customer
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string LastName { get; set; }
    public Guid DepID { get; set; }
    public bool Editable { get { return SomeStruct.Check(DepID); } }
}
于 2012-12-21T12:01:09.777 に答える
1

コードが linq to entity で機能しないことは簡単に再現できます。SQL に変換できないものはすべて、実行時例外をスローしますあなたの場合:

NotSupportedException: LINQ to Entities はメソッド 'Boolean Check(Int32)' メソッドを認識せず、このメソッドはストア式に変換できません。

ある時点でそれを実行した場合、それは関連しstructたり相違したりすることはできません。静的構造体メソッドと静的クラス メソッドの違いは何ですか?classを参照してください。

ToList().の前に追加するなど、他の何かを同時に変更した可能性がありselectます。

于 2012-12-21T19:23:47.773 に答える
0

ランタイムの問題だとすると、多くの場合、これは参照の問題です。EF の linq プロバイダーは、クラス (静的かどうかに関係なく) で宣言された静的メソッドの呼び出しをサポートしています。

  1. 問題の調査に役立つように、構造体をクラスに変更し、静的にすることをお勧めします。

  2. いいえ、最初の反復または顧客を呼び出す前に何も実行されません。

お役に立てれば

于 2012-12-21T11:19:09.327 に答える