0

ここで助けが必要です。EF クエリの一部を再利用可能にしようとしています。

var query = from sr in SomeEFRepository.SelectAll()
            select new {
               KeyValuePivotField1 = (from kvd in sr.KeyValueData
                                      where kvd.KeyName == "FieldName1"
                                      select kvd.Value).FirstOrDefault(),
               KeyValuePivotField2 = (from kvd in sr.KeyValueData
                                      where kvd.KeyName == "FieldName2"
                                      select kvd.Value).FirstOrDefault(),
               KeyValuePivotField3 = (from kvd in sr.KeyValueData
                                      where kvd.KeyName == "FieldName3"
                                      select kvd.Value).FirstOrDefault()
            }

見てみると、私が次のコードを常に繰り返していることがわかります。

(from kvd in sr.KeyValueData
where kvd.KeyName == "SomeFieldName"
select kvd.Value).FirstOrDefault(),

このようなことを行うために EF が認識するメソッドを作成するにはどうすればよいですか?

var query = from sr in SomeEFRepository.SelectAll()
            select new {
               KeyValuePivotField1 = GetFieldFromKeyValue("FieldName1"),
               KeyValuePivotField2 = GetFieldFromKeyValue("FieldName2"),
               KeyValuePivotField3 = GetFieldFromKeyValue("FieldName3"),
            }

どんな提案でも役に立ちます。式ツリーについて読んでいますが、それが良いアプローチであるか、可能であるかさえわかりません。

注: DBContext で EF 5.0 を使用しています。

4

2 に答える 2

0

拡張メソッドはこれに適しているようです。具体的に何をしているのかわからないので、これは例です

顧客クラス

public class Customer{
   public int Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }

   public override string ToString()
   {
       return string.Format("Customer is {0} {1}", this.FirstName, this.LastName);
   }
}

CustomerExtensionMethod

//Class MUST be static
public static class CustomerExtensionMethods
{
    //Method MUST be static and use this keyword to be an extension method
    public static Customer GetByFirstName(this IEnumerable<Customer> source, string value)
    {
        return source.Where(c => c.FirstName == value).FirstOrDefault();
    }
}

それがどのように機能するかを示すメインプログラム

var customers = new List<Customer>
{
    new Customer { Id = 1, FirstName = "Foo", LastName = "Bar" },
    new Customer { Id = 2, FirstName = "Mark", LastName = "Whoknows" },
    new Customer { Id = 3, FirstName = "Ronald", LastName = "McDonald" },
};

var userWithFirstNameOfRonald = customers.GetByFirstName("Ronald");

Console.WriteLine(userWithFirstNameOfRonald.ToString());

これにより、「Customer Is Ronald McDonald」と出力されます。重要な部分はコメントされています。メソッドを含むクラスは静的である必要があり、メソッドは静的である必要があります。それに加えて、メソッドの最初のパラメーターは、thisそれが拡張メソッドであることを通知する必要があります。これにより、最初のパラメーターに指定した特定の型で呼び出すことができます。

于 2013-05-17T20:37:01.710 に答える