首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq左外连接- DefaultIfEmpty错误

Linq左外连接- DefaultIfEmpty错误
EN

Stack Overflow用户
提问于 2011-01-12 21:08:20
回答 2查看 3.6K关注 0票数 6

有一组设备类型,其中一些类型支持配置设置。我试图获得所有设备类型的列表,以及任何适用的设置。

此查询没有拾取没有DeviceParameters的设备。如果按如下所示添加.DefaultIfEmpty(),则会得到以下错误:

“强制转换为值类型'Int64‘失败,因为物化值为null。结果类型的泛型参数或查询必须使用可空类型。”

DefaultIfEmpty的正确的synatx是什么?

代码语言:javascript
复制
            var Devices = from d in dc.DeviceTypes
                      join p in dc.DeviceParameters on d.TypeID equals p.TypeID into tmpTable
                      from items in tmpTable.DefaultIfEmpty()
                      group items by d.DeviceName into g
                      select new
                      {
                          DeviceName = g.Key,
                          settings = from s in g
                                     select new
                                     {
                                         ParamName = s.ParamName,
                                         Param1 = s.Param1,
                                         Param2 = s.Param2,
                                         Param3 = s.Param3
                                     }
                      };
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-12 21:27:17

如果您已经定义了外键关系,我认为解决方案非常简单,除非我遗漏了什么:

代码语言:javascript
复制
var Devices = dc.DeviceTypes
    .Select(p=>new 
        {
             DeviceName = p.DeviceName ,
             settings = p.DeviceParameters
                 .Select(q=>new
                 {
                     ParamName = p.ParamName,
                     Param1 = q.Param1,
                     Param2 = q.Param2,
                     Param3 = q.Param3
                 })
        });

无论如何,我可能会这样做设置部分:

代码语言:javascript
复制
settings = p.DeviceParameters.ToList()
票数 4
EN

Stack Overflow用户

发布于 2011-01-12 21:38:57

我相信,您在查询中看到的问题是,通过使用DefaultIfEmpty()调用,您将尝试从空对象中提取值。如果您有一个有效的DeviceType,但没有映射任何DeviceParameters,那么当它试图用以下语句实现设置属性时:

代码语言:javascript
复制
settings = from s in g
select new
{
    ParamName = s.ParamName,
    Param1 = s.Param1,
    Param2 = s.Param2,
    Param3 = s.Param3
}

它试图创建一个新对象,而"s“的对象为null,因此尝试访问属性ParamName或Param1等将无法工作。我在LINQPad中尝试了相同的代码,当我删除DefaultIfEmpty()调用时,一切都正常。

在不知道属性及其类型的情况下,我无法确定,但正如我所说,基于在LINQPad中实现类似的代码,我得到了类似的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4674094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档