1

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

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

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

也不是每个对象都有联系人,所以有时应该返回 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();

然后我不能将它转换回列表并且仍然是“空引用”。

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

4

2 回答 2

1

我会写 join 语句有点不同:

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 是由错误的连接或其他原因引起的。

于 2013-07-09T05:20:45.030 回答
0

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

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

于 2013-07-08T21:55:26.757 回答