2013-05-19 78 views
0

我想使用泛型将记录加载到我的dbcontext缓存中。我正在使用下面的代码。C#实体框架5.0通用LINQ

_Context.Set<T>().Where(R => (int)R.GetType().GetProperty("Id").GetValue(R) == id).Load(); 

此代码抛出下面的错误,我似乎无法弄清楚如何绕过它。

System.NotSupportedException:LINQ to Entities不能识别方法'System.Object GetValue(System.Object)'方法,并且此方法无法转换为存储表达式。

是我在做什么可能或有另一种方式。

+0

如果您有基本实体类型并添加特征'where T:BaseEntity',这可能会起作用。那么你可以使用'R.ID'。 –

+0

Unforuntaley我需要使用其中T:类来访问dbset一般 –

+0

我也发现,我可以使用下面的代码,它似乎将记录添加到本地缓存,不知道这是做正确的方式。 _Context.Set ().Find(id); –

回答

4

问题是,您正试图使用​​反射方法(GetType(),GetProperty()GetValue())与LINQ to Entities,它不理解它们。您在LINQ查询中允许使用的方法仅限于查询提供程序支持的方法,在LINQ to Entities的情况下,它大部分可以相对容易地转换为SQL。

你将无法尝试这种方式匹配ID,很遗憾。使用.Find(id)将工作,只要通过指定T实体类型的主键的一列和id是正确的类型,但是这将是一个非常脆弱的方法,即使它在某些情况下。

如果你描述你的情况多一点,人们可能有另一种方法把一些很好的建议。你能解释一下为什么你想这么做吗?想要在不知道自己感兴趣的实体类型的情况下执行对您的DbContext的查询是非常不寻常的。

+0

的*只要主键由T指定的实体类型具有单列*不正确:http://msdn.microsoft.com/en-us/library/gg696418(v=vs.103).aspx但正确的是它是一种脆弱的方法。 –

+0

@ ta.speot.is我的意思是,如果你只传递Find()一个值(如他的例子),那么主键也必须包含一列。如果您尝试执行“查找(ID)”,并且实体类型具有复合主键,则它会变成barf。 –

+0

@Jeremy Todd,将其标记为已回答,因为它确实回答了我的问题,但我还没有找到更好的方法来查找函数。我不太了解基本实体概念 –