【问题标题】:Problem accessing association from the result of a lambda query从 lambda 查询的结果访问关联时出现问题
【发布时间】:2010-08-24 16:25:07
【问题描述】:

当您的子记录通过 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(); 如果(msg.SentTS.HasValue)返回; // 获取消息接收者 // 我不明白.. 为什么 lambda 表达式在这里不起作用?返回 0 个结果! // var testtos = msg.GetMessageTos.Where(mt => mt.Active); var tos = 来自 db.MessagesTos 中的 mt 其中 mt.Active && mt.MessageID == msgID 选择山;

【问题讨论】:

    标签: c# linq-to-sql lambda


    【解决方案1】:

    你也可以试试这个,我觉得干净一点。

    var orderLine = db.OrderLines.Single( ol => ol.ID == orderLineID ); 
    var order = orderLine.GetOrder(); 
    

    我相信在你的非工作示例中你想使用.First() 而不是.Single()

    【讨论】:

    • 请查看我的编辑,其中包含不起作用的实际代码(已注释掉)。谢谢!
    • msg.GetMessageTosdb.MessageTos 的返回类型是什么?还有msgdb 是什么类型?这行得通吗:var tos = db.MessagesTos.Where( mt => mt.Active && mt.MessageID == msgID ).First();
    • 您是在循环执行此操作吗?如果是这样,msgID 是如何设置的?您可能会遇到访问关闭问题。
    • testtos 的类型为 IEnumerable,而 tos 的类型为 IQueryable.... msg 的类型为 Message(linq to 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;
    【解决方案2】:

    在我看来,这个问题更多地与关联而不是 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 实际上是空的,无论您对其运行任何进一步的查询。

    【讨论】:

    • 是的,它确实与 db 模型正确匹配。我还将一些代码移到了测试页面,它可以正常工作,包括 lambda 查询。所以我认为这可能与缓存对象图的数据上下文有关,或者与使用 TransactionScope 有关。现在,我将不理会它......它有效。感谢您的意见。
    【解决方案3】:

    请参阅我的编辑以获取有效的代码。我想有时“答案”是做有效的事情,不一定是你理解的事情。

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      相关资源
      最近更新 更多