C# 使用OData/Entity Framework的空导航属性

C# 使用OData/Entity Framework的空导航属性,c#,linq,entity-framework,ado.net,linq-to-entities,C#,Linq,Entity Framework,Ado.net,Linq To Entities,我有一个数据库模式(MySql)作为data/OData服务公开,由我的Silverlight客户端使用Linq查询。以下是所讨论的模型: 列Level和Application是通过外键分别引用表lookuplevel和lookuppid的Int值 因此,logstest表中的条目可能如下所示: ID:35 Date: 2012-02-29 Level: 1 Application: 1 Message: MyMessage Exception: MyException ReverseOrde

我有一个数据库模式(MySql)作为data/OData服务公开,由我的Silverlight客户端使用Linq查询。以下是所讨论的模型:

列Level和Application是通过外键分别引用表lookuplevel和lookuppid的Int值

因此,logstest表中的条目可能如下所示:

ID:35
Date: 2012-02-29
Level: 1
Application: 1
Message: MyMessage
Exception: MyException
ReverseOrder: 56 (don't mind this column)
var linqQuery = (from e in 
   _myEntities.logstests.Expand("lookuppid").Expand("lookuplevel")  
   select e); 
我们可以在lookuplevel中:

ID: 1
String: Warning
lookuppid中

ID: 1
String: Product A
如您所见,级别和应用程序列实际上映射到引用表中的一个值

现在,在客户端(Silverlight),我通过linq查询获取logstest表的内容

public void LoadErrors()
{
   var linqQuery = (from e in _myEntities.logstests
                    select e);

   AsyncCallback GetDataComplete = new AsyncCallback(MyCallback);
           ((DataServiceQuery<logstest>)linqQuery).BeginExecute(GetDataComplete, linqQuery);
}

private void MyCallback(IAsyncResult asyncResult)
{
    DataServiceQuery<logstest> query = asyncResult.AsyncState as DataServiceQuery<logstest>;

    foreach (logstest error in e.Query.EndExecute(e.Result))
    {
        Error newError = new Error
        {
            Date = error.Date,
            Level = error.lookuplevel.String,
            Application = error.lookuppid.String,
            Message = error.Message,
            Exception = error.Exception
        };
    }

    // Do more stuff...
}
public void LoadErrors()
{
var linqQuery=(来自_myenties.logstests中的e)
选择e);
AsyncCallback GetDataComplete=新的AsyncCallback(MyCallback);
((DataServiceQuery)linqQuery).BeginExecute(GetDataComplete,linqQuery);
}
私有void MyCallback(IAsyncResult asyncResult)
{
DataServiceQuery查询=asyncResult.AsyncState作为DataServiceQuery;
foreach(e.Query.EndExecute(e.Result)中的logstest错误)
{
Error newError=新错误
{
日期=错误。日期,
级别=error.lookuplevel.String,
应用程序=error.lookuppid.String,
Message=错误。Message,
异常=错误。异常
};
}
//做更多的事情。。。
}
Error是绑定在datagrid上的自定义类,datagrid在单独的列中显示每个字段

显然,对于级别和应用程序列,我不希望显示它们引用的值的索引,而是显示值本身(即:对于级别,我希望显示警告,而不是1)

问题是error.lookuplevel和error.lookuppid都为null,我不知道为什么。 有我不知道的地方吗?


提前谢谢

通常在EF中,如果未在上下文中启用延迟加载,则需要在查询中按名称包括导航属性:

var linqQuery = (from e in
   _myEntities.logstests.Include("lookuppid").Include("lookuplevel") 
   select e);

请从安装EF 4.1以停止在Include中使用魔术字符串。加

using System.Data.Entity;
使用你的语句

然后编写以下查询:

var linqQuery = _myEntities.logstests.Include(e=>e.lookuppid).Include(e=>e.lookuplevel);

有关更多信息,请参阅以下内容

您必须明确要求包含相关实体,否则WCF DS Client将不会在服务器上要求它。而且它也不会延迟加载导航属性,因为延迟加载必须调用HTTP请求,这可能需要很长时间,所以在属性getter中这样做不是一个好主意

要请求包含相关实体,需要向查询中添加$expand,如下所示:

ID:35
Date: 2012-02-29
Level: 1
Application: 1
Message: MyMessage
Exception: MyException
ReverseOrder: 56 (don't mind this column)
var linqQuery = (from e in 
   _myEntities.logstests.Expand("lookuppid").Expand("lookuplevel")  
   select e); 

我试图这样做,但“Include”方法似乎不存在。我遗漏了什么吗?此外,context.LoadProperty作为后期延迟加载存在。