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利物浦大都会区工程 英国曼彻斯特大都会区英国 要求
我需要一个只包含父记录的结果集。所以在LINQ中,我想到了这样的事情: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
//获取所有细分。
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();
}
}
}