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

标签 c# linq entity-framework ado.net linq-to-entities

我有一个数据库架构 (MySql),作为数据/OData 服务公开,由我的 Silverlight 客户端使用 Linq 进行查询。这是有问题的模型: enter image description here

列 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.lookuplevelerror.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/

相关文章:

c# - Phonegap 独立(离线)应用程序

c# - Linq 多元素选择

c# - 如何根据某些参数在构造函数中调用基构造函数?

c# - 使用 OData QueryableAttribute 修改从 ASP.NET Web API 返回的响应内容

c# - 错误信息 "Operator ' .' cannot be applied to operand of type ' lambda expression '"when converting a method to Extension Method?

c# - VSTO Excel - 如何创建包含多个区域的范围

c# - 非管理员用户单击关联文件时仅传递 1 个参数

c# - LINQ 设计好奇心 : Skip/Take vs. SkipWhile/TakeWhile

c# - 在 Where Linq 语句中使用具有泛型类型的 == 运算符

c# - Entity Framework 3.5 - 如何在不先从数据库加载行的情况下更新行