1

非常に難しい EntityFramework Code First の質問を受けました。これをできるだけシンプルにします。

n個のクラスがあると想像してください。今のところ2から始めましょう

public class Person  
{   
    public string Name { get; set; }  
}



public class Address   
{  
    public string AddressLine1 { get; set; }  
    public string AddressLine2 { get; set; }  
}

さて、私がやりたいことは、単一の文字列、つまり DbContext.Search( "Foo" ) のようなものでドメイン モデルを検索できるようにすることです。この呼び出しは、person テーブルと address テーブルの両方で一致する文字列を検索し、Person エンティティと Address エンティティの両方が入力されたリストを返します。

どうすればいいのか完全にはわかりませんが、DataAnnotationsを使用してこのようなことを行うことを検討しています

public class Person  
{  
    **[Searchable]**  
    public string Name { get; set; }  
}



public class Address   
{  
    **[Searchable]**  
    public string AddressLine1 { get; set; }  
    **[Searchable]**  
    public string AddressLine2 { get; set; }  
}  

私は正しい軌道に乗っていますか?代わりに Fluent API を使用する必要がありますか? 反射?

ありとあらゆる考えを大いに感謝します。

4

2 に答える 2

0

Findメソッドは、主キー列のみを検索します。明示的に主キー列を作成しない場合、findメソッドはエラーをスローします。一般に、EF規則では、propertyName+idをクラスの主キーとして使用します。ただし、Nameで検索する場合は、プロパティに[Key]を追加してください。それが主キーになり、uはプロパティを見つけることができます。dbContext.Addresses.find( "Foo");

于 2012-08-07T11:01:14.440 に答える
0

2 種類の検索結果を投影する新しいオブジェクト タイプを作成します。

public class Result
{
    public string MainField { get; set; } 
    // you may have other properties in here.
}

次に、条件に一致する各タイプのエンティティを見つけて、それらをこのタイプに射影します。

var personResults = DbContext.Persons
      .Where(p => p.Name == "Foo")
      .Select(p => new Result{MainField = p.Name}); 
      // don't forget to map to any other properties you have in Result as well


var addressResults = DbContext.Adresses
     .Where(a => 
        a.AddressLine1 == "Foo" ||  
        a.AddressLine2 == "Foo"
     ).
     .Select(a => new Result{MainField = a.AddressLine1 + ", " + a.AddressLine2 });
     // again, don't forget to map to any other properties in Result 

次に、リストをマージします。

var allResults = personResults.Union(addressResults).ToList();

...その時点で、リストを好きなように並べ替えることができます。

"Result" と "MainField" はかなり一般的です。ドメインモデルを完全に認識していないため、それらを使用しているだけです。

于 2012-08-07T11:35:00.810 に答える