C# 从lambda查询结果访问关联时出现问题

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()得到的是一个空结

当通过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 = (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的使用有关。现在,我不去管它了。。。它起作用了。谢谢你的意见。