2012-01-16 68 views
1

我的理解是find僅將主鍵用作參數。如果您正在查找的值實際上是主鍵,則這很有用。就我而言,我有這樣一個類:在CodeFirst(EntityFramework)中使用查找來獲取非主鍵

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

    public string ChamberName { get; set; } 
} 

我要檢查給定ChamberName是否存在或者我的上下文或數據庫本身。我怎樣才能做到這一點?我是否必須首先自己列舉一下上下文,然後通過諸如db.Chambers.where(a=>a.ChamberName.equals...這樣的調用在數據庫中查找它?

如果ChamberName是我的主鍵,我可以看到它運行良好,但事實並非如此。

感謝,

回答

2

有一個在DbSet稱爲Local財產。您可以首先查詢以找到加載到上下文的實體。

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

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

謝謝Eranga。所以沒有辦法像發現一樣做一次?也就是搜索上下文,那麼如果沒有,那麼數據庫呢?感謝你的回答。我不知道Local。 – 2012-01-16 14:42:53

+0

@PeterKellner在內部查找'方法做類似的事情。也許你可以實現一個可重用的方法。 – Eranga 2012-01-16 14:52:17

+0

是,還是擴展方法。當涉及到通過拉姆達時,我總是受到合理的挑戰。 – 2012-01-16 15:53:48

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,我不相信這會工作,因爲它沒有考慮到的是在上下文(如發現確實) – 2012-01-16 14:41:36

+0

@PeterKellner:好吧,你說的有道理,確實如此。 – 2012-01-16 14:46:58

+0

「Compare」中的ignoreCase參數在轉換爲SQL時似乎在LINQ to Entities中被忽略。我對'false'情況更感興趣(當SQL Server具有默認排序規則=區分大小寫時,區分大小寫的搜索)。我希望你的代碼能夠做到這一點(我之前從未使用'string.Compare'),但它不起作用(我只是測試了它)。我想知道是否有任何方法來控制LTE查詢的區分大小寫。你知道任何?在T-SQL中,會在WHERE子句中使用'COLLATE SomeCollat​​ion',還是有其他方法? – Slauma 2012-01-16 16:48:44