错误的结果可能是因为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是默认的合并选项。”