2012-01-16 8 views
1

私の理解では、主キーのみをパラメータとして取ります。これは、探している値が実際にプライマリキーである場合に効果的です。私の場合、私はこのようなクラスを持っている:CodeFirst(EntityFramework)で非主キーを取得するためにFindを使用する

public class Chamber 
{ 
    [Key] 
    public int Id {get;set;} 

    public string ChamberName { get; set; } 
} 

私は与えられたChamberNameが私のコンテキストまたはデータベース自体のいずれかに存在するかどうかを確認したいです。どうやってやるの?何らかの形でコンテキストを最初に列挙してから、db.Chambers.where(a=>a.ChamberName.equals...のような呼び出しでデータベースで検索しなければなりませんか?

ChamberNameがプライマリキーの場合はうまく動作しますが、そうではありません。

おかげで、

答えて

2

DbSetLocalと呼ばれるプロパティがあります。コンテキストにロードされたエンティティを最初に検索することができます。

var entity = db.Chambers.Local.Where(/**/).SingleOrDefault(); 

if (entity == null) 
{ 
    entity = db.Chambers.Where(/**/).SingleOrDefault(); 
} 
+0

ありがとう、Eranga。それで、findのようにワンショットでやる方法はありませんか?つまり、コンテキストを検索し、存在しない場合はデータベースを検索します。答えに感謝します。私はローカルについて知らなかった。 –

+0

@PeterKellner 'Find'メソッドは内部的に何か類似しています。おそらく、再利用可能なメソッドを実装できます。 – Eranga

+0

はい、または拡張メソッド。私はlamdasの周りを渡すことになると、常に論理的に挑戦しています。 –

2

あなたは.Find()メソッドを使用することはできません - しかし、方法について:あなたが手動で何かを列挙する必要はありません

public Chamber FindByChamberName(string chamberName) 
{  
    using(MyDbContext ctx = new MyDbContext()) 
    { 
     Chamber result = ctx.Chambers 
          .FirstOrDefault(c => string.Compare(c.ChamberName, chamberName, true)); 
     return result; 
    } 
} 

- ちょうどそれによってチャンバの最初の発生を検索します名前 - またはなし。あなただけの(そのChamberNameで指定)指定された室が存在するかどうかを知る必要がある場合

は、あなたがのLINQで.Any()方法を使用することができます。

using(MyDbContext ctx = new MyDbContext()) 
{ 
    return ctx.Chambers.Any(c => string.Compare(c.ChamberName, chamberName, true)); 
} 
+0

marc_sは、私はそれがコンテキストにあるものを考慮していないので、(検索が行うように)、これは –

+0

@PeterKellnerを動作するとは思わない:OK、あなたは確かに、そこにポイントを得ました。 –

+0

'Compare 'の' ignoreCase'パラメータは、SQLに変換されたときにLINQ to Entitiesで無視されるようです。私は 'false'ケース(SQL Serverがデフォルトの照合=大文字と小文字を区別しない場合の大文字小文字の区別検索)にもっと興味を持っていました。私はあなたのコードがトリックを行うことを望んでいました(LTEでは以前は 'string.Compare'を使ったことはありませんでしたが)動作しません(私はそれをテストしました)。私は、LTEクエリから大文字と小文字の区別を制御する方法があるかどうか疑問に思っています。何でも知ってますか? T-SQLでは、WHERE句に 'COLLATE SomeCollat​​ion'を使用するか、あるいは他の方法がありますか? – Slauma

関連する問題