Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从IQueryable中选择新对象返回案例中列表的一部分_C#_Linq - Fatal编程技术网

C# 从IQueryable中选择新对象返回案例中列表的一部分

C# 从IQueryable中选择新对象返回案例中列表的一部分,c#,linq,C#,Linq,我正在尝试从IQueryable中选择新对象列表。当该IQueryable中的特定参数为null时,它将返回该对象以外的列表 var companyName = "Company"; var gridObjects = iQueryableObjectList.Select(obj => new GridObject { AddedByEmployeeId = obj.AddedByEmployeeId, AddedByEmplo

我正在尝试从
IQueryable
中选择新对象列表。当该
IQueryable
中的特定参数为
null
时,它将返回该对象以外的列表

var companyName = "Company";    

var gridObjects = iQueryableObjectList.Select(obj => 
    new GridObject
    {
        AddedByEmployeeId = obj.AddedByEmployeeId,
        AddedByEmployeeSignature = obj.AddedByEmployee.Signature,
        AddedDateTime = obj.Created,
        DocumentId = obj.DocumentId,
        ResponsibleEmployeeId = obj.ResponsibleEmployeeId,
        ResponsibleEmployee = obj.ResponsibleEmployeeId != null ? 
            obj.ResponsibleEmployee.FirstName + " " + obj.ResponsibleEmployee.LastName :
            companyName,
        Id = obj.Id,
        IsCompanyWide = obj.IsCompanyWide
    });
iQueryableObjectList
包含6个类型为
ObjectItem
的对象。其中一个函数的
responsibleeemployeeid
值设置为
null

在这个select语句之后,
gridObjects
包含5个元素,所有元素都来自
iQueryableObjectList
,只有一个
ResponsibleEmployeeId
值设置为
null
的元素除外

我提到,
ResponsibleEmployeeId
在这两个类中都是
Guid?
ObjectItem
GridObject

如果我删除此项:

ResponsibleEmployeeId = obj.ResponsibleEmployeeId,
ResponsibleEmployee = obj.ResponsibleEmployeeId != null ? 
    obj.ResponsibleEmployee.FirstName + " " + obj.ResponsibleEmployee.LastName :
    companyName,
从select语句返回6个元素

有人对此有想法吗?如果需要,请询问其他信息


编辑:问题解决了。在该实体的某些配置映射中,
ResponsibleEmployeeId
是必需的,因此当EF看到它有一个空值时,它会忽略它。

尝试更改代码
obj.ResponsibleEmployeeId!=空值
by
obj.responsibleeemployeeid!=DBNull.Value

var companyName = "Company";    

var gridObjects = iQueryableObjectList.Select(obj => new GridObject
            {
                AddedByEmployeeId = obj.AddedByEmployeeId,
                AddedByEmployeeSignature = obj.AddedByEmployee.Signature,
                AddedDateTime = obj.Created,
                DocumentId = obj.DocumentId,
                ResponsibleEmployeeId = obj.ResponsibleEmployeeId,
                ResponsibleEmployee = obj.ResponsibleEmployeeId != DBNull.Value ? 
                    obj.ResponsibleEmployee.FirstName + " " + obj.ResponsibleEmployee.LastName :
                    companyName,
                Id = obj.Id,
                IsCompanyWide = obj.IsCompanyWide
            });

好的,当涉及到将相关实体解析为POCO(
GridObject
)时,EF也有类似的问题。在您的情况下,我不认为它会让任何东西绊倒,但事实上,您的源表中有一个FK列,带有
ResponsibleEmployeeId
,您可以再次检查该值是否实际为Null

请尝试以下操作:

var gridObjects = iQueryableObjectList.Select(obj => 
    new GridObject {
    {
        AddedByEmployeeId = obj.AddedByEmployeeId,
        AddedByEmployeeSignature = obj.AddedByEmployee.Signature,
        AddedDateTime = obj.Created,
        DocumentId = obj.DocumentId,
        ResponsibleEmployeeId = obj.ResponsibleEmployee.EmployeeId
        ResponsibleEmployee = obj.ResponsibleEmployee != null ? 
            obj.ReponsibleEmployee.FirstName + " " + obj.ResponsibleEmployee.LastName :
            companyName,
        Id = obj.Id,
        IsCompanyWide = obj.IsCompanyWide
    });
LINQ到实体有一些“怪癖”,这取决于从EF中获取
iQueryableObjectList
的过程,考虑到它可能尚未实现,您也可能会被其中之一绊倒。在对可能为空的实体使用操作时,尝试使POCO ViewModel饱和时,有时会出现
NullReferenceException
s和奇怪的行为。通常,我的目标是在尝试饱和POCO之前,让查询文件饱和结果实体或中间匿名类型

对于视图模型,我通常会将它们相对于返回的数据保持相当“平坦”。例如,在上面的示例中,我会考虑在<代码> GRIDObjult<代码>中使用<代码>第一代码< /Cord> <代码> LSTNEX/<代码>列,以及<代码> CuffyNAM> <代码>,然后有一个计算属性,名为 DistPosieNo>代码>。从LINQ到实体,填充POCO的相关位将变成:

(Select new GridObject {
    ...
    FirstName = obj.ResponsibleEmployee.FirstName, // EF automatically handles cases where ResponsibleEmployee is Null
    LastName = obj.ResponsibleEmployee.LastName,
    CompanyName = companyName,
    ...

然后在
GridObject
中有一个
DisplayName
,它是根据
EmployeeId
和/或名称数据的可用性来计算的。

如果在选择之前具体化收集,例如
iQueryableObjectList.ToArray(),您可以复制它吗(…
?我怀疑特定的
IQueryable的实现细节,我在这里不能这么做。因为在我选择之后,我使用了一个框架,它对列表进行排序和筛选,为了工作,它需要IQueryable。“它返回列表,但返回该对象”是什么意思意思是?首先Guid可以为null吗?这看起来不太合适。您的输入是一个可查询的objectItem列表,您可以使用select将其更改为GridObjects。这很酷。您删除的第二行是if语句。您知道吗?我无法重现您的问题。您可以创建并共享小型pro吗如果只删除第一行:
responsibleeemployeeid=obj.responsibleeemployeeid,
?它说我不能将Guid与DBNull进行比较,这是一个很好的观点,但如果我这样做,我会
我将实际切断IQueryable和数据库之间的链接。我使用的框架有一些对表进行排序和筛选的方法,需要保留该链接。在该实体的一些配置映射中,需要
ResponsibleeEmployeeId
,因此当EF看到它有一个空值时,它会直接忽略它。是的,是的。ToList()将有效地切断延迟加载的联系,但这通常应该在查询结束时发生。.选择()使视图模型或数据饱和应该是最后的操作之一。EF没有GridObject的含义,因此您应该致力于解决“to SQL”问题按该点进行查询。在GridModel中展平名称列并在其中使用已中断的名称将消除.ToList()命令并且可能会解决您的问题。至于ResponsibleEmployeeId FK列,我尽可能避免使用这些列,而只使用导航属性,将FK映射到EF的后台。两者兼有的问题是代码很容易依赖于这两个值中的任何一个。即,将ResponsibleEmployee设置为ID=15的实体,其中父记录上的ResponsibleEmployeeId设置为12。哪个应该是正确的?有FK会吸引人们使用它,或者认为它自动与导航成员相关。
(Select new GridObject {
    ...
    FirstName = obj.ResponsibleEmployee.FirstName, // EF automatically handles cases where ResponsibleEmployee is Null
    LastName = obj.ResponsibleEmployee.LastName,
    CompanyName = companyName,
    ...