我有一个数据库架构 (MySql),作为数据/OData 服务公开,由我的 Silverlight 客户端使用 Linq 进行查询。这是有问题的模型:
列 Level 和 Application 是 Int 值,分别通过外键引用表lookuplevel和lookuppid。
因此,logstest 表中的条目可能如下所示:
ID:35
Date: 2012-02-29
Level: 1
Application: 1
Message: MyMessage
Exception: MyException
ReverseOrder: 56 (don't mind this column)
我们可以在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...
}
Error 是一个绑定(bind)在数据网格上的自定义类,该数据网格在单独的列中显示每个字段。
显然,对于“级别”和“应用程序”列,我不想显示它们引用的值的索引,而是显示值本身(即:对于级别,我想显示警告而不是 1)。
问题是 error.lookuplevel 和 error.lookuppid 都是 null,我不知道为什么。 是否存在我不知道的问题?
提前致谢!
最佳答案
您必须明确要求包含相关实体,否则 WCF DS 客户端将不会在服务器上请求它。而且它也不会延迟加载导航属性,因为延迟加载必须调用 HTTP 请求,这可能需要很长时间,因此在属性 getter 内执行此操作并不是一个好主意。
要要求包含相关实体,您需要将 $expand 添加到查询中,如下所示:
var linqQuery = (from e in
_myEntities.logstests.Expand("lookuppid").Expand("lookuplevel")
select e);
关于c# - 使用 OData/Entity Framework 的空导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9506376/