QueryableProvider<T>的Where问题及解决建议 返回

C#论坛 老数据
5 2976

大佬,发现一个关于Where的问题。
如下代码所示:

//初始定义一个query变量
var query = db.Queryable<LiveRoom>().Where(r => r.Status == 0);
//查询ForbidFlag==0的实体
LiveRoom room = query.Where(r => r.ForbidFlag == 0).First();
//执行后的sql代码为(截取where部分的代码):WHERE ( [Status] = @Status0 )  AND ( [ForbidFlag] = @ForbidFlag1 )) T WHERE RowIndex BETWEEN 1 AND 1
 [{"key":"@Status0","value":"0"},{"key":"@ForbidFlag1","value":"0"}]
//查询ForbidFlag==1的数量
int forbidenRoomCount = query.Where(r => r.ForbidFlag == 1).Count();
//执行后的sql代码为(截取where部分的代码):WHERE ( [Status] = @Status0 )  AND ( [ForbidFlag] = @ForbidFlag1 )  AND ( [ForbidFlag] = @ForbidFlag2 )) CountTable 
 [{"key":"@Status0","value":"0"},{"key":"@ForbidFlag1","value":"0"},{"key":"@ForbidFlag2","value":"1"}]

Where方法会将前面执行的Where条件累加起来,而query已经不是原始的query了,这是一个问题.

解决的建议:可以在增加条件的时候,通过深拷贝一个临时变量出来,不用直接返回当前的this。您看可以吗?

热忱回答5

  • 4.5.1.6 版本周六会有更新


    LiveRoom room = query.First(r => r.ForbidFlag == 0).;


    更新后的新版本后这样写就没有问题 

    0 回复
  • 只要是queryable直接操作数据库就不需执行拼接,不要用WHERE

    0 回复
  • @fate stay night:有的时候会先创建一个查询,然后后面会再次根据这个查询去进行筛选排序等操作

    0 回复
  • @青云飘零:等我更新后把 .where().single() 改成 .single(it=>it.id)  这种我现在还没更新

    0 回复
  • 已经更新了 

    0 回复