繁体   English   中英

LINQ获取记录计数

[英]LINQ Get Count of records

我需要将此SQL查询重写为LINQ EF:

SELECT Filter,Attribute,AttributeGroup,AttributeGroupTop,AttributeType,AttributeName,AttributeColor,AttributeSequence,AttributeImage,Sequence,
CASE AttributeType 
WHEN '1' THEN
(Select COUNT(DISTINCT ItemID) FROM NavFilters with(nolock) WHERE Link='lighting' AND SubLink='chandeliers' AND Attribute1=Web_AttributesSchemaEx.Attribute)
WHEN '2' THEN
(Select COUNT(DISTINCT ItemID) FROM NavFilters with(nolock) WHERE Link='lighting' AND SubLink='chandeliers' AND  Attribute2=Web_AttributesSchemaEx.Attribute)
WHEN '3' THEN
(Select COUNT(DISTINCT ItemID) FROM NavFilters with(nolock) WHERE Link='lighting' AND SubLink='chandeliers' AND  Attribute3=Web_AttributesSchemaEx.Attribute)         
WHEN '4' THEN
(Select COUNT(DISTINCT ItemID) FROM NavFilters with(nolock) WHERE Link='lighting' AND SubLink='chandeliers' AND  Attribute4=Web_AttributesSchemaEx.Attribute)         
WHEN '5' THEN
(Select COUNT(DISTINCT ItemID) FROM NavFilters with(nolock) WHERE Link='lighting' AND SubLink='chandeliers' AND  Attribute5=Web_AttributesSchemaEx.Attribute)         
WHEN '6' THEN
(Select COUNT(DISTINCT ItemID) FROM NavFilters with(nolock) WHERE Link='lighting' AND SubLink='chandeliers' AND  Attribute6=Web_AttributesSchemaEx.Attribute)         
WHEN '7' THEN
(Select COUNT(DISTINCT ItemID) FROM NavFilters with(nolock) WHERE Link='lighting' AND SubLink='chandeliers' AND  Attribute7=Web_AttributesSchemaEx.Attribute)         
WHEN '8' THEN
(Select COUNT(DISTINCT ItemID) FROM NavFilters with(nolock) WHERE Link='lighting' AND SubLink='chandeliers' AND  Attribute8=Web_AttributesSchemaEx.Attribute)         
WHEN 'P' THEN
(Select COUNT(DISTINCT ItemID) FROM NavFilters with(nolock) WHERE Link='lighting' AND SubLink='chandeliers' AND  AttributeP=Web_AttributesSchemaEx.Attribute)         
END
AS Count

FROM Web_AttributesSchemaEx with(nolock) WHERE (AttributeType='P' AND Website='LXD') OR (Link='lighting' AND SubLink='chandeliers'  AND Website='LXD')
ORDER BY AttributeType,AttributeSequence

这是我的代码:

db.Web_AttributesSchemaEx.Select(e => new
                {                    
                    Link = e.Link,
                    SubLink = e.SubLink,
                    Website = e.Website,
                    Filter = e.Filter,
                    AttributeType = e.AttributeType,
                    AttributeName = e.AttributeName,
                    AttributeSequence = e.AttributeSequence,
                    Count = e.AttributeType == "1" ? db.NavFilters.GroupBy(x => x.ItemID).Select(x => x.FirstOrDefault()).Count(x => x.Attribute1 == e.Attribute && x.Link == link && x.SubLink == subLink) :
                            e.AttributeType == "2" ? db.NavFilters.GroupBy(x => x.ItemID).Select(x => x.FirstOrDefault()).Count(x => x.Attribute1 == e.Attribute && x.Link == link && x.SubLink == subLink) :
                            e.AttributeType == "3" ? db.NavFilters.GroupBy(x => x.ItemID).Select(x => x.FirstOrDefault()).Count(x => x.Attribute1 == e.Attribute && x.Link == link && x.SubLink == subLink) :
                            e.AttributeType == "4" ? db.NavFilters.GroupBy(x => x.ItemID).Select(x => x.FirstOrDefault()).Count(x => x.Attribute1 == e.Attribute && x.Link == link && x.SubLink == subLink) :
                            e.AttributeType == "5" ? db.NavFilters.GroupBy(x => x.ItemID).Select(x => x.FirstOrDefault()).Count(x => x.Attribute1 == e.Attribute && x.Link == link && x.SubLink == subLink) :
                            e.AttributeType == "6" ? db.NavFilters.GroupBy(x => x.ItemID).Select(x => x.FirstOrDefault()).Count(x => x.Attribute1 == e.Attribute && x.Link == link && x.SubLink == subLink) :
                            e.AttributeType == "7" ? db.NavFilters.GroupBy(x => x.ItemID).Select(x => x.FirstOrDefault()).Count(x => x.Attribute1 == e.Attribute && x.Link == link && x.SubLink == subLink) :
                            e.AttributeType == "8" ? db.NavFilters.GroupBy(x => x.ItemID).Select(x => x.FirstOrDefault()).Count(x => x.Attribute1 == e.Attribute && x.Link == link && x.SubLink == subLink) :
                            e.AttributeType == "P" ? db.NavFilters.GroupBy(x => x.ItemID).Select(x => x.FirstOrDefault()).Count(x => x.Attribute1 == e.Attribute && x.Link == link && x.SubLink == subLink) : 0
                }).Where(x => (x.AttributeType == "P" && x.Website == "LXD") || (x.Link == "lighting" && x.SubLink == "chandeliers" && x.Website == "LXD")).OrderBy(x => x.AttributeType).ThenBy(x => x.AttributeSequence);

我的记录count有问题。 SQL SP正确结果是: http : //prntscr.com/9oqsoz这是我得到的结果: http : //prntscr.com/9oque7记录顺序正确,其他字段也正确。 但是我想知道我错过了什么吗? 有谁能够帮助我? 这很奇怪,但我注意到此错误仅适用于此类LinkSubLink

我认为您的SQL CASE表达式的等效LINQ表达式应该是这样的(请注意...COUNT(DISTINCT(ItemID))).. SQL的一部分)

//...
Count = 
    e.AttributeType == "1" ? db.NavFilters.Where(x => x.Attribute1 == e.Attribute && 
        x.Link == link && x.SubLink == subLink).Select(x => x.ItemID).Distinct().Count() :
    e.AttributeType == "2" ? ...

试试这个...代替您的初始查询-

SELECT
    Filter,
    Attribute,
    AttributeGroup,
    AttributeGroupTop,
    AttributeType,
    AttributeName,
    AttributeColor,
    AttributeSequence,
    AttributeImage,
    [Sequence],
    [Count] = (
        SELECT COUNT(DISTINCT
            CASE WHEN
                    (e.AttributeType = '1' AND n.Attribute1 = e.Attribute) OR
                    (e.AttributeType = '2' AND n.Attribute2 = e.Attribute) OR
                    (e.AttributeType = '3' AND n.Attribute3 = e.Attribute) OR
                    (e.AttributeType = '4' AND n.Attribute4 = e.Attribute) OR
                    (e.AttributeType = '5' AND n.Attribute5 = e.Attribute) OR
                    (e.AttributeType = '6' AND n.Attribute6 = e.Attribute) OR
                    (e.AttributeType = '7' AND n.Attribute7 = e.Attribute) OR
                    (e.AttributeType = '8' AND n.Attribute8 = e.Attribute) OR
                    (e.AttributeType = 'P' AND n.AttributeP = e.Attribute)
                THEN n.ItemID END
        )
        FROM NavFilters n
        WHERE n.Link = 'lighting'
            AND n.SubLink = 'chandeliers'
    )
FROM Web_AttributesSchemaEx e
WHERE (AttributeType = 'P' AND Website = 'LXD') 
    OR (Link = 'lighting' AND SubLink = 'chandeliers' AND Website = 'LXD')
ORDER BY AttributeType, AttributeSequence

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM