2012-03-10 12 views
2

Entity Frameworkを初めて使用しようとしていますが、ちょっと立ち往生しました。オブジェクトを使用してEntity Frameworkを照会する

私はクラスAccountDataAccessあります、

public class AccountDataAccess 
{ 
    public IEnumerable<Account> Get(Account account) 
    { 

    } 
} 

そして、別のクラスをAccountDataAccess.Get()が呼び出されると、アカウントのパラメータ1つまたは複数のフィールドを埋めることができ

public class Account 
{ 
    string UserName { get; set; } 
    string Password { get; set; } 
    string Email { get; set; } 
    Session Session { get; set; } 
} 

アカウント(例えばUserNameだけが値を持つ)。 Entity Frameworkに、値を含むフィールドのみを含む検索を使用してデータベースを照会する方法はありますか?

いくつかのグーグルを行った後、私はそれをやって見ることができる唯一の方法は、

public IEnumerable<Account> Get(Account account) 
    { 
     StringBuilder queryStringBuilder = new StringBuilder("SELECT VALUE account FROM MyDatabase.Account as account WHERE "); 
     if (!String.IsNullOrWhiteSpace(account.UserName)) 
      queryStringBuilder.Append("UserName = " + account.UserName); 

     if (!String.IsNullOrWhiteSpace(account.Email)) 
      queryStringBuilder.Append("Email = " + account.Email); 
     ... 
     //continue for all fields 
     //then call database 
    }  

明らかにこれはしかし、それを行うためのひどい道であるようなものです。何か案は?

EDIT

私は

Account account1 = new Account() {UserName = "UserA", Email = "[email protected]"}; 
Account account2 = new Account() {UserName = "UserB"}; 

を持っていたのであれば、フルたとえば、私はaccount1のためのクエリが

var _context = new EntityModel(); 

    return _context.Where(w => w.UserName == account.UserName 
      && w.UserName == account1.UserName 
      && w.Email == account1.Email 
      ).ToList(); 

ことを期待するだろうが、account2のクエリは無視します入力されていないメールフィールド:

var _context = new EntityModel(); 

    return _context.Where(w => w.UserName == account2.UserName 
      ).ToList(); 

私の質問は、動的に生成することができますラムダ式は、値を持つフィールドのみを含めることができますか?あなたはエンティティモデルを持っている後のLINQを使用する必要が

using (var _context = new EntityModel()) { 
var value = from c in _ontext 
      select person 
} 

:あなたはエンティティモデルを作成し、プロジェクト内のエンティティモデルを使用してのように、データベースからものを引っ張るためにLINQクエリを使用する必要が

+0

ちょっとメモしておきます...あなたのインターフェイスの前にプレフィックスを付けることをお勧めします。アカウントインターフェイスの名前をIAccountに変更する必要があります。 – c0deNinja

答えて

1

ToList()のような評価操作を追加するまで、クエリは処理されません。だから、あなたができることの1つは、SQLと同じようにクエリを構築することです。

var query = _context.Accounts.AsQueryable(); 

if (!String.IsNullOrWhiteSpace(account1.UserName)) 
    query = query.Where(a => a.UserName == account1.UserName); 

if (!String.IsNullOrWhiteSpace(account1.Email)) 
    query = query.Where(a => a.Email == account1.Email); 

もう少し冗長ですが、クエリ構文でも同じことができます。

クエリの作成が完了したら、ToList()、ToArray()などを実行して実際にクエリを実行し、データベースから読み取ります。

+0

もっと一般的なやり方があると思っていましたが、これはこれまでのところ私にとって最高の解決策です。乾杯。 – jfc37

0

作成されました。エンティティはそのLINQをSQLに変換してコードを実行します。

+0

ありがとうございますが、linq式にwhere句を追加する方法がありますが、これはアカウントオブジェクトに入力されたフィールドのみを表示しますか? – jfc37

0

私はあなたの質問を理解していれば、私は知らないが、Entity Frameworkのオブジェクトのあるクエリはこのようなものになるだろう:このクエリはIEnumerable<Account>を返しになりますが、このアカウントは」勝った

public class AccountDataAccess 
{ 
    public IEnumerable<Account> Get(Account account) 
    { 
     var _context = new EntityModel(); 

     return _context.Where(w => w.UserName == account.UserName 
       && w.Password == account.Password 
       && w.Email == account.Email 
       /* && other you need */ 
       ).ToList(); 
    } 
} 

あなたのアカウントがEntity Frameworkのアカウントになります。

public IEnumerable<Account> Get(Account account) 
    { 
     var _context = new List<Account>(); 

     return _context 
      .Where(w => w.UserName == account.UserName 
       && w.Password == account.Password 
       && w.Email == account.Email 
      ) 
      .Select(s => new Account { 
       UserName = s.UserName, 
       Password = s.Password, 
       Email = s.Email 
      }).ToList(); 
    } 

しかし、このため

あなたはクラスではないインターフェイスとしてアカウントを宣言する必要が動作するように:

アカウントを返すために、あなたはこれを必要とします。

+0

アカウントをクラスに変更しました。うまくいけば私の質問を編集しました。 – jfc37

1

簡潔にすると、Entity Frameworkの特質は、テーブルをクラス(またはその逆)にマッピングすることです。 Accountクラスは、それがあなたのdatabaaseで対応する表現だ必要があります、そして、あなたのコンテキストに含まれるdbsetsを照会することによって、強く型付けされた方法でそれにアクセスする必要があり、と言った:

//Accounts is a dbset representing the db records for the Account table 
_context.Accounts.Where(x => x.UserName == account.UserName && x.Password == account.Password && x.Email == account.Email); 

ハードコードされたSQL文と言ってこれは、 EF(例えばテーブルパラメータ)で何かができない場合にのみ使用してください。今質問:

ADO.Netとは異なり、EFを使用してクエリを実行すると、すべてのフィールドを持つPOCO(Accountクラス)のリストが返されます。パラメータが(アカウントのアカウント)になっている場合は、クエリフィルタを実行するかどうかを選択する必要があります。 EFは強く型付けされたクエリに基づいています。より動的なものが必要な場合は、look to anonymous typesを使用できますが、インラインステートメントの使用は最後のカードである必要があります。 An overview of Entity Framework

関連する問題