【问题标题】:Using Find in CodeFirst (EntityFramework) to get non-primary keys使用代码优先(实体框架)中的查找来获取非主键
【发布时间】:2012-01-16 06:20:31
【问题描述】:

我的理解是find只以主键为参数。如果您要查找的值实际上是主键,那将非常有用。就我而言,我有这样的课程:

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

    public string ChamberName { get; set; }
 }

我想检查给定的ChamberName 是否存在于我的上下文或数据库本身中。我怎样才能做到这一点?我是否必须先以某种方式自己枚举上下文,然后通过db.Chambers.where(a=>a.ChamberName.equals... 之类的调用在数据库中查找它?

如果ChamberName 是我的主键,我可以看到它运行良好,但它不是。

谢谢,

【问题讨论】:

    标签: entity-framework-4.1 ef-code-first code-first


    【解决方案1】:

    DbSet 中有一个名为Local 的属性。您可以先查询它以查找加载到上下文中的实体。

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

    【讨论】:

    • 谢谢埃兰加。所以没有办法像 find 那样一次性完成吗?也就是说,搜索上下文,如果没有,那么数据库呢?感谢你的回答。我不知道本地。
    • @PeterKellner Find 方法在内部做了类似的事情。也许你可以实现一个可重用的方法。
    • 是的,或者扩展方法。在传递 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));
    }
    

    【讨论】:

    • marc_s,我不相信这会起作用,因为它没有考虑上下文中的内容(就像 find 一样)
    • Compare 中的 ignoreCase 参数在转换为 SQL 时似乎在 LINQ to Entities 中被忽略。我对false 的大小写更感兴趣(SQL Server 默认排序规则时区分大小写的搜索 = 不区分大小写)。我希望你的代码能解决问题(我之前从未在 LTE 中使用过string.Compare),但它不起作用(我刚刚测试过)。我想知道是否有任何方法可以控制 LTE 查询的区分大小写。你知道任何?在 T-SQL 中,可以在 WHERE 子句中使用COLLATE SomeCollation,还是有其他方法?
    • 我天真地使用了比较,认为它会起作用。感谢您指出这一点。
    猜你喜欢
    • 2016-10-17
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2017-01-25
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多