Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DbContext.Set()上的LINQ_C#_Linq_Entity Framework_Reflection - Fatal编程技术网

C# DbContext.Set()上的LINQ

C# DbContext.Set()上的LINQ,c#,linq,entity-framework,reflection,C#,Linq,Entity Framework,Reflection,所以,基本上,我试图从实体名称字符串返回一个DbSet。这就是我取得的成绩: var customers = db.Set(Type.GetType("App.Model.Customer, App.Model, Version=1.0.0.0, Culture=neut

所以,基本上,我试图从实体名称字符串返回一个DbSet。这就是我取得的成绩:

var customers = db.Set(Type.GetType("App.Model.Customer, 
                                     App.Model, 
                                     Version=1.0.0.0, 
                                     Culture=neutral, 
                                     PublicKeyToken=null"));

但是我不能像任何一个或一个那样表演其他LINQ。为什么会这样?我怎样才能改变它呢?

根据您的需求,不,如果需求改变了,您也许可以解决它。如果在运行时将类型设置为字符串,那么在编译代码之前,您如何相信可以针对它进行编程


静态类型需要静态类型才能工作,您可以使用接口执行一些ninja dynamics来绕过其中的一部分,但您的问题没有提供此类信息。

对于您的需求,没有,如果需求发生变化,您可能可以绕过它。如果在运行时将类型设置为字符串,那么在编译代码之前,您如何相信可以针对它进行编程


静态类型需要静态类型才能工作,您可以使用接口执行一些ninja dynamics来绕过其中的一部分,但您的问题没有提供此类信息。

非泛型重载返回同样的非泛型。这个类实现的接口之一是IQueryable,同样也是非泛型的。这就是为什么它不能作为泛型类型IQueryable上定义的任何LINQ扩展方法的输入

因此,事实上,如果您仍然想使用LINQ,您只需推迟转换为通用IQueryable的时间。你可以

…这将返回包装在IQueryTable中且CustomerId==1的客户

您甚至可以使用“查找”方法:


这将返回一个客户实例。

的非泛型重载将返回一个同样非泛型的实例。这个类实现的接口之一是IQueryable,同样也是非泛型的。这就是为什么它不能作为泛型类型IQueryable上定义的任何LINQ扩展方法的输入

因此,事实上,如果您仍然想使用LINQ,您只需推迟转换为通用IQueryable的时间。你可以

…这将返回包装在IQueryTable中且CustomerId==1的客户

您甚至可以使用“查找”方法:


这将返回单个客户实例。

尝试将非泛型IQueryable强制转换为泛型,其中泛型属性是超类,甚至只是对象,例如:

((IQueryable<object>)context.Set(Type.GetType(...))).Count();

这对我有用

尝试将非泛型IQueryable强制转换为泛型,其中泛型属性是超类,甚至只是对象,例如:

((IQueryable<object>)context.Set(Type.GetType(...))).Count();

这对我有用

@Adrian的可能副本似乎你理解这个问题。介意在这里简单解释一下吗?@Md.lbrahim在链接的问题中你不明白什么?这个问题和答案似乎很好地解释了这个问题。总而言之,不能在DbContext.SetTypeVariable上使用Linq,因为它不返回DbSet,而是返回一个DbSet,这意味着没有可以推断用于Linq方法的类型。您可以改为使用DbContext。根据使用反射注入类型的给定答案设置一个调用。然后您就可以使用Linq。@默认情况下,我恐怕没有。我不明白为什么我会关心本地和什么是IActionTarget?如果你能在这里简单地解释一下,会有帮助的。@Adrian的可能副本似乎你理解这个问题。介意在这里简单解释一下吗?@Md.lbrahim在链接的问题中你不明白什么?这个问题和答案似乎很好地解释了这个问题。总而言之,不能在DbContext.SetTypeVariable上使用Linq,因为它不返回DbSet,而是返回一个DbSet,这意味着没有可以推断用于Linq方法的类型。您可以改为使用DbContext。根据使用反射注入类型的给定答案设置一个调用。然后您就可以使用Linq。@默认情况下,我恐怕没有。我不明白为什么我会关心本地和什么是IActionTarget?如果你能在这里简单地解释一下,那会有帮助的。我得到的只是字符串的名称,我必须克服这一点。如果我需要使用dynamic,那就这样吧。在这一点上,任何可行的解决方案都对我有帮助。谢谢。那么您需要某种最小的接口,您知道类型将从中继承吗?你有吗?我现在没有。但这不应该太难。例如,我将让我的模型从一个接口继承。我得到的只是作为字符串的名称,我必须克服这一点。如果我需要使用dynamic,那就这样吧。在这一点上,任何可行的解决方案都对我有帮助。谢谢。那么您需要某种最小的接口,您知道类型将从中继承吗?你有吗?我现在没有。但这不应该太难。例如,我将让我的模型从接口继承。
var customer = db.Set(Type.GetType(...)).Find(1);
((IQueryable<object>)context.Set(Type.GetType(...))).Count();