2013-12-19 30 views
1

我想查询我的数据库基于EntityKey是否有一个inbuild(或更简单的方法)来做到这一点?SqlQuery EntityKey并返回相应的对象

我目前的做法,将是这样的:

using (var context = new DbContext()) 
{ 
    context.DataBase.SqlQuery<TestTable>("select * from @p0 where @p1 = @p2", EntityKey.EntitySetName, EntityKey.EntityKeyValues[0].Name, EntityKey.EntityKeyValues[0].Value); 
} 

(该解决方案目前有问题,该EntitySetName心不是在表名和我需要抢表名了元数据,同样与也可能不同于数据库的Id的名称)

或者甚至有没有办法使用LINQ来做到这一点? (我愿意,因为我不会需要手动翻译)

+0

乌尔Q不是很清楚..你有什么错误? – Rupesh

+0

@Rupesh:我得到绝对没有错误,我只想知道是否有一种方法来查询数据库的EntityKey属性的帮助下,您发布在您的答案中的链接对我来说没有用,因为我已经使用EntityFramework。我的问题只是如何实现这一点,只有EntityKey。 –

+0

有没有理由不能使用'context.Set ().Find(EntityKey.EntityKeyValues [0] .Value)'? –

回答

1

如果您知道正在检索的实体的类型,您可以使用DbContext上的Set方法获得DbSet,并使用Find方法DbSet通过其键获取实体。

var dbSet = dbContext.Set<TestTable>(); 
var entity = dbSet.Find(EntityKey.EntityKeyValues[0].Value); 

Find方法知道如何使用键值来获取实体;实际上,签名是Find(params object[]),所以如果您的表具有复合键(只要它们的顺序正确),则可以传递多个键值。

+0

为您提供+50,因为此解决方案不需要投射到IObjectContextAdapter。 –

2

你可以投你DbContextIObjectContextAdapter接口,并从那里你可以访问底层ObjectContext对象,它具有GetObjectByKey method

using (var context = new DbContext()) 
{ 
    var objectContext = ((IObjectContextAdapter)context).ObjectContext; 
    var entity = objectContext.GetObjectByKey(yourEntityKey); 
} 
+0

如果我没有弄错,这只适用于已经加载并且与这个上下文相关并且不查询数据库的。 –

+0

不,根据msdn它应该查询db:“如果对象当前没有加载到对象上下文中,则执行查询以尝试从数据源返回对象。” – nemesv

相关问题