Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅检索循环引用(或父)记录的LINQ语句? SQL表列 创建表[dbo].[countrysubsection] ( [CountrySubsectionCode][VARCHAR](10)不为空, [CountryCode]作为 ( 转换([CHAR](2),左([CountrySubsectionCode],(2)),(0)) ) 坚持,, [细分代码]作为 ( CONVERT([VARCHAR](7)、子字符串([CountrySubsectionCode]、CHARINDEX('-',[CountrySubsectionCode])+(1)、LEN([CountrySubsectionCode])-CHARINDEX('-',[CountrySubsectionCode])、(0)) ) 坚持,, [Name][NVARCHAR](255)不为空, [Category][VARCHAR](50)不为空, [ParentSubscriptionCode][VARCHAR](7)空 约束[PK_CountrySubsection]主键群集 ( [CountrySubsectionCode]ASC ) ) SQL表示例数据 Parent 国家分部 代码名称类别代码 --------------------------------------------------------------------------------- GB-ENG英国国家/地区空 GB-SCT GB-SCT苏格兰国家/地区空 GB-WLS GB-WLS威尔士国家/地区空 GB-NIR GB-NIR北爱尔兰省空 GB-BKM GB-BKM白金汉郡两级县 GB-CAM GB-CAM剑桥郡两级县工程 GB-CMA GB-CMA坎布里亚两级县工程 英国伦敦南华克区英国伦敦南华克区 GB-STN英国伦敦萨顿区 GB-TWH英国伦敦区哈姆雷特大厦 GB-LDS GB-LDS利兹大都会区工程 GB-LIV GB-LIV利物浦大都会区工程 英国曼彻斯特大都会区英国 要求_C#_Sql_Linq_Silverlight - Fatal编程技术网

C# 仅检索循环引用(或父)记录的LINQ语句? SQL表列 创建表[dbo].[countrysubsection] ( [CountrySubsectionCode][VARCHAR](10)不为空, [CountryCode]作为 ( 转换([CHAR](2),左([CountrySubsectionCode],(2)),(0)) ) 坚持,, [细分代码]作为 ( CONVERT([VARCHAR](7)、子字符串([CountrySubsectionCode]、CHARINDEX('-',[CountrySubsectionCode])+(1)、LEN([CountrySubsectionCode])-CHARINDEX('-',[CountrySubsectionCode])、(0)) ) 坚持,, [Name][NVARCHAR](255)不为空, [Category][VARCHAR](50)不为空, [ParentSubscriptionCode][VARCHAR](7)空 约束[PK_CountrySubsection]主键群集 ( [CountrySubsectionCode]ASC ) ) SQL表示例数据 Parent 国家分部 代码名称类别代码 --------------------------------------------------------------------------------- GB-ENG英国国家/地区空 GB-SCT GB-SCT苏格兰国家/地区空 GB-WLS GB-WLS威尔士国家/地区空 GB-NIR GB-NIR北爱尔兰省空 GB-BKM GB-BKM白金汉郡两级县 GB-CAM GB-CAM剑桥郡两级县工程 GB-CMA GB-CMA坎布里亚两级县工程 英国伦敦南华克区英国伦敦南华克区 GB-STN英国伦敦萨顿区 GB-TWH英国伦敦区哈姆雷特大厦 GB-LDS GB-LDS利兹大都会区工程 GB-LIV GB-LIV利物浦大都会区工程 英国曼彻斯特大都会区英国 要求

C# 仅检索循环引用(或父)记录的LINQ语句? SQL表列 创建表[dbo].[countrysubsection] ( [CountrySubsectionCode][VARCHAR](10)不为空, [CountryCode]作为 ( 转换([CHAR](2),左([CountrySubsectionCode],(2)),(0)) ) 坚持,, [细分代码]作为 ( CONVERT([VARCHAR](7)、子字符串([CountrySubsectionCode]、CHARINDEX('-',[CountrySubsectionCode])+(1)、LEN([CountrySubsectionCode])-CHARINDEX('-',[CountrySubsectionCode])、(0)) ) 坚持,, [Name][NVARCHAR](255)不为空, [Category][VARCHAR](50)不为空, [ParentSubscriptionCode][VARCHAR](7)空 约束[PK_CountrySubsection]主键群集 ( [CountrySubsectionCode]ASC ) ) SQL表示例数据 Parent 国家分部 代码名称类别代码 --------------------------------------------------------------------------------- GB-ENG英国国家/地区空 GB-SCT GB-SCT苏格兰国家/地区空 GB-WLS GB-WLS威尔士国家/地区空 GB-NIR GB-NIR北爱尔兰省空 GB-BKM GB-BKM白金汉郡两级县 GB-CAM GB-CAM剑桥郡两级县工程 GB-CMA GB-CMA坎布里亚两级县工程 英国伦敦南华克区英国伦敦南华克区 GB-STN英国伦敦萨顿区 GB-TWH英国伦敦区哈姆雷特大厦 GB-LDS GB-LDS利兹大都会区工程 GB-LIV GB-LIV利物浦大都会区工程 英国曼彻斯特大都会区英国 要求,c#,sql,linq,silverlight,C#,Sql,Linq,Silverlight,我需要一个只包含父记录的结果集。所以在LINQ中,我想到了这样的事情: //获取所有细分。 var csData=getSubsections()作为ObservableCollection; //获取所有父细分。 var psData=csData.Where ( ps=> ps.parentsubscriptioncode.IsNull()&& csData,有吗 ( cs=> cs.parentsubsectioncode==ps.subsectioncode ) ) .OrderBy(p

我需要一个只包含父记录的结果集。所以在LINQ中,我想到了这样的事情:

//获取所有细分。
var csData=getSubsections()作为ObservableCollection;
//获取所有父细分。
var psData=csData.Where
(
ps=>
ps.parentsubscriptioncode.IsNull()&&
csData,有吗
(
cs=>
cs.parentsubsectioncode==ps.subsectioncode
)
)
.OrderBy(ps=>ps.CountrySubsectionCode)
.ThenBy(ps=>ps.Category)
.ThenBy(ps=>ps.Name)
.ToObservableCollection();
仅供参考,
IsNull()
是我使用的一种简单扩展方法:

公共静态bool为空(此对象为obj)
{
返回obj==null;
}

问题:
是否有比我必须满足我的要求更好的LINQ语句?

如果我理解正确,那么应该从给定数据集中返回的唯一一行是
GB-ENG

您不必创建中间集合。您可以使用相同的集合,如下所示:

var data = items.Where(i1 =>
    i1.ParentSubdivisionCode == null &&
    items.Any(i2 => i2.ParentSubdivisionCode == i1.SubdivisionCode)
)
.OrderBy(i => i.CountrySubdivisionCode)
.ThenBy(i => i.Category)
.ThenBy(i => i.Name)
.ToList();
如果性能是一个问题(取决于您的支持数据集),您可能希望首先检索
parentsubsectioncode
值的集合,以优化
Contains
方法。这仅对LINQ to对象有效

var parentSubdivisionCodes = new HashSet<string>(items.Select(i => i.ParentSubdivisionCode));
var data = items.Where(i => 
    i.ParentSubdivisionCode == null &&
    parentSubdivisionCodes.Contains(i.SubdivisionCode)
)
.OrderBy(ps => ps.CountrySubdivisionCode)
.ThenBy(ps => ps.Category)
.ThenBy(ps => ps.Name)
.ToList();

不管它值多少钱,它看起来还是不错的/可读的。你有没有遇到任何问题?@Chris-据我所知还没有,但这还没有公布给测试人员。我只是想确定它是完全优化的,因为我所做的远远不止是我控制中的这个过滤器。@ScottChamberlain-我的对象是从WCF服务创建的。没有框架。只有标准的LINQ。
GetSubdivisions()
做什么,您可以将查询传递给它,以便过滤后的查询通过LINQtoEntities、LINQtoSQL或您自己的框架传递给SQL?如果您可以像现在这样在服务器端而不是客户端执行过滤,那么效率会更高。编辑:您说您正在使用WCF服务,是否有任何方法可以向WCF传递筛选器(或添加新函数以传递筛选器)?您还考虑过使用(WCF的兄弟)@ScottChamberlain-
GetSubsections()
获取所有国家/地区细分(父级和子级)的默认集合,因为所有项目,无论是父级还是子级,都仍然是各自的细分,因此循环引用。
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1 {

    internal class Program {

        static void Main(string[] args) {

            #region
            var store = @"
                GB-ENG,   GB,       ENG,      England,             country,                  NULL
                GB-SCT,   GB,       SCT,      Scotland,            country,                  NULL
                GB-WLS,   GB,       WLS,      Wales,               country,                  NULL
                GB-NIR,   GB,       NIR,      Northern Ireland,    province,                 NULL
                GB-BKM,   GB,       BKM,      Buckinghamshire,     two-tier county,          ENG
                GB-CAM,   GB,       CAM,      Cambridgeshire,      two-tier county,          ENG
                GB-CMA,   GB,       CMA,      Cumbria,             two-tier county,          ENG
                GB-SWK,   GB,       SWK,      Southwark,           London borough,           ENG
                GB-STN,   GB,       STN,      Sutton,              London borough,           ENG
                GB-TWH,   GB,       TWH,      Tower Hamlets,       London borough,           ENG
                GB-LDS,   GB,       LDS,      Leeds,               metropolitan district,    ENG
                GB-LIV,   GB,       LIV,      Liverpool,          metropolitan district,     ENG
                GB-MAN,   GB,       MAN,      Manchester,          metropolitan district,    ENG
            ";

            var items = store
                .Split(new[] { '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries)
                .Select(line => line.Trim())
                .Where(line => line != string.Empty)
                .Select(line => line
                    .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
                    .Select(item => item.Trim())
                    .Where(item => item != string.Empty)
                    .ToArray()
                )
                .Select(item => new {
                    Code = item[0],
                    CountrySubdivisionCode = item[1],
                    SubdivisionCode = item[2],
                    Name = item[3],
                    Category = item[4],
                    ParentSubdivisionCode = item[5] == "NULL" ? default(string) : item[5]
                })
                .ToList();
            #endregion

            #region
            Console.WriteLine();
            items.Where(i1 =>
                i1.ParentSubdivisionCode == null &&
                items.Any(i2 => i2.ParentSubdivisionCode == i1.SubdivisionCode)
            )
            .OrderBy(i => i.CountrySubdivisionCode)
            .ThenBy(i => i.Category)
            .ThenBy(i => i.Name)
            .ToList()
            .ForEach(d => Console.WriteLine(d.Code));
            #endregion

            #region
            Console.WriteLine();
            var parentSubdivisionCodes = new HashSet<string>(items.Select(i => i.ParentSubdivisionCode));
            items.Where(i => 
                i.ParentSubdivisionCode == null &&
                parentSubdivisionCodes.Contains(i.SubdivisionCode)
            )
            .OrderBy(ps => ps.CountrySubdivisionCode)
            .ThenBy(ps => ps.Category)
            .ThenBy(ps => ps.Name)
            .ToList()
            .ForEach(d => Console.WriteLine(d.Code));
            #endregion

            #region
            Console.WriteLine();
            var csData = items;
            csData.Where(ps =>
                ps.ParentSubdivisionCode == null &&
                csData.Any(cs =>
                    cs.ParentSubdivisionCode == ps.SubdivisionCode
                )
            )
            .OrderBy(ps => ps.CountrySubdivisionCode)
            .ThenBy(ps => ps.Category)
            .ThenBy(ps => ps.Name)
            .ToList()
            .ForEach(d => Console.WriteLine(d.Code));
            #endregion

            Console.ReadLine();
        }
    }
}