1

我有以下表格结构:

在此处输入图像描述

目前过滤用户是通过非常复杂的嵌套 SQL 查询实现的(而且它是由 Linq 自动生成的)。我看起来大约像:

SELECT FROM (SELECT FROM (SELECT FROM ( infinity here...))))

有没有简化过滤过程的好方法?

请考虑到有不同的特征类型。以下是子查询条件示例:

... WHERE cv.Text like '%aaa%' AND c.Id = 5
... WHERE cv.ImageId IS NOT NULL AND c.Id = 10
... WHERE cv.Number > 5 AND c.Id = 33

ETC...

将不胜感激任何帮助和想法(更改数据库结构,更改技术等...),谢谢!

4

2 回答 2

1

SQL to LINQ 的表现会很差
如果你想优化性能和可伸缩性,那就去 TSQL

  1. 数据库设计 3nf
  2. 索引
    不要过度索引,因为它们会减慢插入和更新速度
  3. 查询设计
  4. 本地缓存

本地缓存
在 exe 开始时下载静态或半静态 FK 表并将它们保存在字典中。
然后在您的下拉菜单中使用 Dictionary 而不是对 SQL 的另一个调用。
然后在查询中我发送 FK ID,以便选择减少一个连接(它有所作为)。

于 2013-09-25T22:35:54.247 回答
1

正如您描述的那样,您的查询应该是这样的

select u.id
from Users as u
where
    exists (
        select *
        from CharacteristicValues as cv
        where cv.Text like '%aaa%' and cv.CharacteristicId = 5 and u.Id = cv.UserId
    ) and 
    exists (
        select *
        from CharacteristicValues as cv
        where cv.ImageId is not null and cv.CharacteristicId = 10 and u.Id = cv.UserId
    ) and 
    exists (
        select *
        from CharacteristicValues as cv
        where cv.Number > 5 and cv.CharacteristicId = 33 and u.Id = cv.UserId
    )

甚至

    select distinct cv.UserId
    from CharacteristicValues as cv
    where cv.Text like '%aaa%' and cv.CharacteristicId = 5

    union

    select distinct cv.UserId
    from CharacteristicValues as cv
    where cv.ImageId is not null and cv.CharacteristicId = 10

    union

    select distinct cv.UserId
    from CharacteristicValues as cv
    where cv.Number > 5 and cv.CharacteristicId = 33
于 2013-09-24T19:30:15.753 回答