C# 从lambda查询结果访问关联时出现问题
当通过lambda查询加载子记录时,是否有人在使用LINQ to SQL获取要加载的关联时遇到问题?例如:C# 从lambda查询结果访问关联时出现问题,c#,linq-to-sql,lambda,C#,Linq To Sql,Lambda,当通过lambda查询加载子记录时,是否有人在使用LINQ to SQL获取要加载的关联时遇到问题?例如: var orderLine = db.OrderLines. Where(ol => ol.ID == orderLineID select ol). First(); // navigate to order via the association var order = orderLine.GetOrder(); 基本上,我从GetOrder()得到的是一个空结
var orderLine = db.OrderLines.
Where(ol => ol.ID == orderLineID select ol).
First();
// navigate to order via the association
var order = orderLine.GetOrder();
基本上,我从GetOrder()得到的是一个空结果
但如果我这样做:
var orderLine = (from ol in db.OrderLines where ol.ID == orderLineID).First();
var order = orderLine.GetOrder();
很好
这是什么原因造成的?这是虫子吗
编辑:下面是实际的代码,它可以处理被注释掉的不起作用的Lambda表达式
var msg=db.Messages.Where(m=>m.ID==msgID.First();
if(msg.sents.HasValue)返回;
//获取邮件收件人
//我不明白。。为什么lambda表达式在这里不起作用?返回0个结果!
//var testtos=msg.GetMessageTos.Where(mt=>mt.Active);
var tos=从mt到db.MessagesTos
其中mt.Active&&mt.MessageID==msgID
选择机器翻译;
你也可以试试这个,我觉得它干净一点
var orderLine = db.OrderLines.Single( ol => ol.ID == orderLineID );
var order = orderLine.GetOrder();
我相信在您的非工作示例中,您希望使用
.First()
而不是.Single()
您也可以尝试这个,我认为它更干净一些
var orderLine = db.OrderLines.Single( ol => ol.ID == orderLineID );
var order = orderLine.GetOrder();
我相信在您的非工作示例中,您希望使用
.First()
而不是.Single()
在我看来,问题更多地与关联有关,而不是lambda表达式
在您的场景中,这应该是可行的:
var tos = db.MessagesTos.Where(mt=> mt.Active && mt.MessageID);
但这不会:
var tos = from mt in msg.SentTS
where mt.Active
select mt;
至于为什么它不起作用,我建议在设计器中查看关联,并检查它是否正确匹配db模型(匹配正确的列)。我还建议确认msg.SentTS实际上是空的,不管您对它运行任何进一步的查询。在我看来,问题更多地与关联有关,而不是lambda表达式 在您的场景中,这应该是可行的:
var tos = db.MessagesTos.Where(mt=> mt.Active && mt.MessageID);
但这不会:
var tos = from mt in msg.SentTS
where mt.Active
select mt;
至于为什么它不起作用,我建议在设计器中查看关联,并检查它是否正确匹配db模型(匹配正确的列)。我还建议确认msg.SentTS实际上是空的,不管您对它运行任何进一步的查询。请参阅我的编辑以了解有效的代码。我想有时候“答案”是做有效的事情,而不一定是你理解的事情 有关有效的代码,请参见我的编辑。我想有时候“答案”是做有效的事情,而不一定是你理解的事情 请看我的编辑与实际代码不工作(注释掉)。谢谢
msg.GetMessageTos
和db.MessageTos
的返回类型是什么?还有什么类型是msg
和db
?这是否有效:var-tos=db.MessagesTos.Where(mt=>mt.Active&&mt.MessageID==msgID.First()代码>您是否在循环中执行此操作?如果是,如何设置msgID?您可能遇到访问关闭问题。testtos的类型为IEnumerable,而tos的类型为IQueryable。。。。msg的类型是Message(一个linq到sql类),db是System.Data.linq.DataContext的子类。我相信var-tos=db.MessagesTos.Where(mt=>mt.Active&&mt.MessageID==msg);会有用的。似乎只有在使用lambda exp完成原始查询时才访问关联。不,它不是从循环内部调用的。msgID是通过另一个函数设置的:db.Messages.InsertOnSubmit(msg);db.SubmitChanges();msgID=msg.ID;请看我的编辑与实际代码不工作(注释掉)。谢谢msg.GetMessageTos
和db.MessageTos
的返回类型是什么?还有什么类型是msg
和db
?这是否有效:var-tos=db.MessagesTos.Where(mt=>mt.Active&&mt.MessageID==msgID.First()代码>您是否在循环中执行此操作?如果是,如何设置msgID?您可能遇到访问关闭问题。testtos的类型为IEnumerable,而tos的类型为IQueryable。。。。msg的类型是Message(一个linq到sql类),db是System.Data.linq.DataContext的子类。我相信var-tos=db.MessagesTos.Where(mt=>mt.Active&&mt.MessageID==msg);会有用的。似乎只有在使用lambda exp完成原始查询时才访问关联。不,它不是从循环内部调用的。msgID是通过另一个函数设置的:db.Messages.InsertOnSubmit(msg);db.SubmitChanges();msgID=msg.ID;是的,它确实与db模型正确匹配。我还将一些代码移到了测试页面,它正常工作,包括lambda查询。所以我认为这可能与datacontext缓存对象图有关,或者与TransactionScope的使用有关。现在,我不去管它了。。。它起作用了。谢谢您的输入。是的,它确实与db模型正确匹配。我还将一些代码移到了测试页面,它正常工作,包括lambda查询。所以我认为这可能与datacontext缓存对象图有关,或者与TransactionScope的使用有关。现在,我不去管它了。。。它起作用了。谢谢你的意见。