C# 在另一个Linq扩展调用中使用Linq扩展调用会引发异常
上面的代码抛出一个null异常 当我像下面的代码一样添加ToList时,代码运行良好C# 在另一个Linq扩展调用中使用Linq扩展调用会引发异常,c#,linq,linq-extensions,C#,Linq,Linq Extensions,上面的代码抛出一个null异常 当我像下面的代码一样添加ToList时,代码运行良好 var tagByGroupIds = TagandTaggroupsservice.SelectAllQuery() .Where(p => p.Tagid == i.TagId) .Select(p => p.Taggroupid); var tagGroups = Taggroupsservice.SelectA
var tagByGroupIds = TagandTaggroupsservice.SelectAllQuery()
.Where(p => p.Tagid == i.TagId)
.Select(p => p.Taggroupid);
var tagGroups = Taggroupsservice.SelectAllQuery()
.Where(p => tagByGroupIds.Contains(p.Taggroupid)).ToList();
我不明白为什么。你能解释一下吗
更多细节。TagandTaggroup和Taggroup是数据库中的表
为第一个查询选择AllQuery
var tagByGroupIds = TagandTaggroupsservice.SelectAllQuery()
.Where(p => p.Tagid == i.TagId)
.Select(p => p.Taggroupid).ToList();
在本例中,SelectAll是TagandTaggroup表。
cid是已传递的值,因此它不是null。它里面有一个int
在我们升级到.Net4.5.1之前,它一直运行良好。我不知道这是否与此有关。如能解释,将不胜感激
堆栈跟踪是按请求进行的
var query = from tt in SelectAll()
join tg in TagGroups on tt.Taggroupid equals tg.Taggroupid
where tg.cid== cid
select tt;
return query.Distinct();
您应该发布完整的异常消息,包括堆栈跟踪。我不知道.net版本是否会有所不同。但是,它也不应该在以前的版本上运行,因为tagbyGroupID不会执行,并且在不执行相同的linq表达式并且调用List后立即执行之前,不能在另一个linq表达式中使用。如果您想使用嵌套,那么您需要像在SelectAll中一样使用join。谢谢您的评论。基于您的评论,并且因为我预感问题出在SelectAllQuery中,我尝试使用SelectAll运行相同的代码,它不进行任何连接,并且运行得非常完美。即使延迟执行,也可以实现结果@基于代码的您是对的,.net版本与此无关。旧代码不需要连接,这就解释了为什么在它工作之前。既然连接是问题所在,那是否意味着Linq到SQL转换器不知道如何转换语句?
System.NullReferenceException was unhandled by user code
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=System.Data.Linq
StackTrace:
at System.Data.Linq.SqlClient.SqlFactory.Member(SqlExpression expr, MemberInfo member)
at System.Data.Linq.SqlClient.QueryConverter.VisitMemberAccess(MemberExpression ma)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp)
at System.Data.Linq.SqlClient.QueryConverter.VisitBinary(BinaryExpression b)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp)
at System.Data.Linq.SqlClient.QueryConverter.VisitWhere(Expression sequence, LambdaExpression predicate)
at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitSelect(Expression sequence, LambdaExpression selector)
at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitDistinct(Expression sequence)
at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitWhere(Expression sequence, LambdaExpression predicate)
at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitSelect(Expression sequence, LambdaExpression selector)
at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitContains(Expression sequence, Expression value)
at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.VisitExpression(Expression exp)
at System.Data.Linq.SqlClient.QueryConverter.VisitWhere(Expression sequence, LambdaExpression predicate)
at System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitMethodCall(MethodCallExpression mc)
at System.Data.Linq.SqlClient.QueryConverter.VisitInner(Expression node)
at System.Data.Linq.SqlClient.QueryConverter.ConvertOuter(Expression node)
at System.Data.Linq.SqlClient.SqlProvider.BuildQuery(Expression query, SqlNodeAnnotations annotations)
at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
at System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at ***.***.TagByProductcontroller.getTagGroupsByProduct(Int32 productId)