错误的结果可能是因为MergeAs(仅AppendOnly)LINQ

错误的结果可能是因为MergeAs(仅AppendOnly)LINQ,linq,c#-4.0,Linq,C# 4.0,注意 id groupid status name ------------------------------------ guid1 guidA reserved truck1 guid2 guidA reserved truck2 guid3 guidA reserved truck3 guid4 guidA reserved truck4 *assume all guids are guids.. **id

注意

id     groupid   status     name
------------------------------------
guid1  guidA     reserved   truck1
guid2  guidA     reserved   truck2
guid3  guidA     reserved   truck3
guid4  guidA     reserved   truck4

*assume all guids are guids.. 
**id is a primary key (unique)
这可能是个骗局。但我没有从中得到明确的答案

问题

我从林克那里得到了错误的结果

示例

id     groupid   status     name
------------------------------------
guid1  guidA     reserved   truck1
guid2  guidA     reserved   truck2
guid3  guidA     reserved   truck3
guid4  guidA     reserved   truck4

*assume all guids are guids.. 
**id is a primary key (unique)
案例

id     groupid   status     name
------------------------------------
guid1  guidA     reserved   truck1
guid2  guidA     reserved   truck2
guid3  guidA     reserved   truck3
guid4  guidA     reserved   truck4

*assume all guids are guids.. 
**id is a primary key (unique)
如果我只在groupid==guidA中放置
,结果是正确的(4行)

但是,如果我将
放入groupid==guidA&&status==reserved
中,结果是错误的(3行)

解释

使用表达式树生成的查询。从调试观察中,查询(返回错误结果)如下所示

query.Expression:
-----------------
转换(值(System.Data.Objects.ObjectSet`1[myEFTable]))
.MergeAs(仅限附录)
.Where(m=>(m.groupId==值(myFilterClass.groupId))
.Where(m=>m.status.Contains(值(myFilterClass.statusStr))
.Select(m=>newmyviewClass()
{
Id=m.Id,GroupId=m.GroupId,Status=m.Status,Name=m.Name
})
.OrderBy(o=>o.Name).Skip(0).Take(10)
然后我尝试运行一个类似的查询,它返回正确的结果

假设e是ObjectSet,strGuid是guidA
Guid网格=新Guid(strGuid);
e、 AsQueryable()
其中(m=>m.status.Contains(“保留”))
.Where(m=>m.groupId==grId)
.Select(m=>newmyviewClass()
{
Id=m.Id,GroupId=m.GroupId,Status=m.Status,Name=m.Name
}).OrderBy(o=>o.Name).Skip(0).Take(10);
问题

我对这个错误一无所知

  • 如果我的EF表正确并且查询正确,为什么返回错误的结果

  • 是因为
    MergeAs(仅附录)
    ?因为唯一不同的是

  • 如果这是关于unique key的,我应该如何使用
    myViewClass
    来确保每一行都是唯一的,并且不应该合并(如果是这样的话)

    ---------------------------------------------------------------------
  • 更新2013/08/29

    结果不正确,因为我的一个查询中有一个输入错误

    所以,在这里和那里改变了一些东西之后,不断尝试和错误,直到我几乎失去了任何改变、评论、擦除的痕迹,突然它起作用了。。尤里卡!!什么

    我所做的并不是真的改变一切,只是改变了很多,但与我开始的地方没有太大的不同。。就是这样

    然后,尤里卡的时刻结束了,让我回头看看到底哪里出了问题,因为我不相信奇迹

    就是这样

    这些表格实际上与此类似:

     PartsGroups   
     -----------
     id  name   
     -----------
     1   Nails  
     -----------
    
     Items
     -----------------
     id  name   status
     -----------------
     2  Table  Empty
     5  Table  Indent
     6  Door   Empty
     3  Sofa   Empty
    
     PartsGroupPairs      
     ------------------   
     id  groupId partId   
     ------------------   
     1       1       4    
     2       1       7    
     3       1       8    
     4       1      15    
     -------------------  
    
     Parts                      
     ------------------------   
     id  name  itemId  status   
     ------------------------   
      4  XNail      2  Empty    
      7  SNail      5  Empty    
      8  UNail      6  Empty    
     15  ZNail      3  Empty    
     ------------------------   
    
    关系是这样的

     PartsGroups   PartsGroupPairs      Parts                      Items
     -----------   ------------------   ------------------------   -----------------
     id  name      id  groupId partId   id  name  itemId  status   id  name   status
     -----------   ------------------   ------------------------   -----------------
     1   Nails     1       1       4     4  XNail      2  Empty     2  Table  Empty
     1   Nails     2       1       7     7  SNail      5  Empty     5  Table  Indent
     1   Nails     3       1       8     8  UNail      6  Empty     6  Door   Empty
     1   Nails     4       1      15    15  ZNail      3  Empty     3  Sofa   Empty
     -----------   -------------------  ------------------------   -----------------
           One <---> Many       Many <---> One           Many <------> One 
    
     PartsGroup.pairs is a collection of PartsGroupPairs 
     PartsGroupPair.group is a PartsGroup 
     PartsGroupPair.part is a Part
     Part.item is an Item
     Item.parts is a collection of Parts
    
    此行未被选中

     PartsGroups   PartsGroupPairs      Parts                      Items
     -----------   ------------------   ------------------------   -----------------
     id  name      id  groupId partId   id  name  itemId  status   id  name   status
     -----------   ------------------   ------------------------   -----------------
     1   Nails     2       1       7     7  SNail      5  Empty     5  Table  Indent
     -----------   -------------------  ------------------------   -----------------
    
    我犯的错误是在
    的Where
    部分。查询本身是在运行时构建的,因为它是独立的实体、过滤器、视图和分页模块。因此,我通常只是在这里和那里传递
    IQueryable

    对于filter,每次进行筛选时,我都会在何处添加另一个。所以在这种情况下,情况如下:

    使用(var DB=new databaseContext())
    {
    对象集d=
    DB.CreateObjectSet(“partsGroupPair”);
    int searchGroupId=1;//例如,int代替guid
    int searchStatus=“空”;
    //按特定零件组筛选
    IQueryable e=d.Where(m=>m.group.id==searchGroupId);
    //如果我想按状态筛选
    e=e.Where(m=>m.part.item.status==searchStatus));//错误!!
    //我想按part.status而不是item.status进行筛选
    //因此,应该是这样
    e=e.Where(m=>m.part.status==searchStatus));//对!!
    //看法
    可查询的f=
    e、 选择(m=>newpartsGroupPairView()
    {
    Id=m.Id,GroupId=m.GroupId,
    Status=m.part.Status,Name=m.part.Name
    //等等。。
    });
    //寻呼
    f=f.OrderBy(o=>o.Name).Skip(0).Take(10);
    }
    
    错误的筛选使LINQ忽略其他部分,并返回3行而不是4行,因为它只找到一个项而不是2个部分

    所以在我的例子中,这是一个愚蠢的输入错误,数据相当复杂


    当一切似乎都正常时,却什么都不起作用,这真是令人沮丧。

    “AppendOnly是默认的合并选项。”