【问题标题】:Entity Framework join statement in a function函数中的实体框架连接语句
【发布时间】:2013-07-06 08:31:57
【问题描述】:

我正在尝试创建一个函数来获取类型为“tableContact”的 List(),它是一个实体(有点像当您执行简单的选择语句时:query.ToList();)

但这变得令人沮丧,因为我不断收到“空对象引用”错误。由于某种原因,“join”语句不起作用,所以我尝试了另一种 linq 语句。

我有一个 Object2Contacts 表,我想 LEFT JOIN,我正在查找我的对象并尝试查看该对象的所有联系人。我也不知道如何将“匿名类型”改回实体表。

也不是每个对象都有联系人,所以有时应该返回 null List。

public List<tableContact> getContactsForObject(int oid)
    {
        if (oid > 0)
        {
            var query = (from s in entities.tableContacts
                         from o in entities.tableObject2Contacts
                         where s.contact_id == o.contact_id
                         where o.object_id == oid                         
                         select new { s });
            if (query != null)
            {
                IEnumerable<tableContact> e = (IEnumerable<tableContact>)query.ToList();
                return (List<tableContact>)e;
            }
        }
        return new List<tableContact>();
    }

然后我想遍历返回的对象...例如:

foreach ( tableContact c in MyList){
   WriteLine(c.Name);
}

编辑 我也试过了:

List<tableContacts> contacts = (from s in entities.tableContacts
        join o in entities.tableObject2Contacts
        on s.contact_id equals o.contact_id
        where o.object_id == oid                         
        select s).ToList();

然后我无法将它转换回 List 并且仍然是“空引用”。

编辑 2 是的,我正在运行的查询肯定会带来一个“空”列表。我不介意空列表,但它不应该给出“对象空引用”。

【问题讨论】:

    标签: c# asp.net linq entity-framework entity-framework-4


    【解决方案1】:

    我会写一点不同的连接语句:

    var query = (from s in entities.tableContacts
                 join o in entities.tableObject2Contacts
                      on new { ContactID = s.contact_id, ObjectID = oid } 
                      equals new { ContactID = o.contact_id, ObjectID = o.objectID } 
                      into oTemp
                 from o in oTemp.DefaultIfEmpty()
                 select new { s });
    

    这将是使用 linq 的正确左连接。 也许您的 NullReferenceException 是由错误的连接或其他原因引起的。

    【讨论】:

      【解决方案2】:

      没关系,“我也试过这个”实际上是正确的代码,但由于某种原因,我没有正确建立我的实体,所以返回 null。

      虽然我仍然对“anonymoustypes”感到非常困惑,但我不知道如何创建一个返回“anonymoustype”的函数。

      【讨论】:

      • 我更困惑“on s.contact_id == o.contact_id”这一行是如何编译的,它应该是“on s.contact_id equals o.contact_id”。函数也不能返回匿名类型,您必须将该类型转换为 Class 并返回它。从理论上讲,您可以创建一个 Contacts Joined Class 并从两个表中为其提供所需的属性,然后在您的选择中放置 select new JoinedType{Propertyname = s.property, PropertyName = o.property}。参见链接stackoverflow.com/questions/1070526/…
      • 正确我写错了。我的意思是“等于”。我不确定为什么 Linq 似乎有所区别。是的,我对匿名类型及其工作方式感到困惑。
      • @Dexter - 你不能返回匿名类型......所以这就是你对如何这样做感到困惑的原因。你必须返回一个具体的类型。
      猜你喜欢
      • 1970-01-01
      • 2019-06-14
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多