LINQ到SQL:我如何为了通过复合对象?
-
11-07-2019 - |
题
我有以下的LINQ to SQL查询,其中我试图做一个多列GROUP BY:
return from revision in dataContext.Revisions
where revision.BranchID == sourceBranch.BranchID-1
&& !revision.HasBeenMerged
group revision by new Task(revision.TaskSourceCode.ToUpper(),
revision.TaskSourceID)
into grouping
orderby grouping.Key ascending
select (ITask)grouping.Key;
此抛出InvalidOperationException异常( “无法由型 '任务'。命令”)。
是否有任务必须实现一个接口(它的已的实现了IComparable,IComparable的
请注意,我已经尝试过的匿名类型分组,它失败,类似的InvalidOperationException异常:
...
group revision by new { Code = revision.TaskSourceCode.ToUpper(),
Id = revision.TaskSourceID }
...
有关它的价值,请注意,任务对象是2个字段的复合材料;一个是单个字符(通常的“S”或“B”),而另一个是一个int(实际上跨数据库“外键”如果你喜欢)。排序由任务的行为只是比较它们的字符串表现;例如。任务 'B101'<任务 'S999'
解决方案
看起来你已经有了解决方案,但只是FYI的LINQ to SQL不支持.ToUpper()
。
例如:
NorthwindDataContext dc = new NorthwindDataContext();
Product product = dc.Products.Single(p => p.ProductName.ToUpper() == "CHAI");
被翻译成:
exec sp_executesql N'SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
FROM [dbo].[Products] AS [t0]
WHERE <b>UPPER([t0].[ProductName]) = @p0</b>',N'@p0 nvarchar(4)',@p0=N'CHAI'
希望有所帮助。
其他提示
行,我这出。我有两个问题;首先,ToUpper的()并没有转化为SQL,其次,我不认为LINQ到SQL排序依据的对象支持;至少没有非实体。通过分解的OrderBy成它的组成列,一切开始按计划工作。
return from revision in dataContext.Revisions
where revision.BranchID == sourceBranch.BranchID-1
&& !revision.HasBeenMerged
group revision by new { revision.TaskSourceCode,
revision.TaskSourceID }
into grouping
orderby grouping.Key.TaskSourceCode,
grouping.Key.TaskSourceID ascending
select (ITask)new Task(grouping.Key.TaskSourceCode,
grouping.Key.TaskSourceID);
我想你你的组之前,需要选择的 - 你想对象转换为任务,然后由其他的东西(Task.start或东西)为了
LINQ到SQL可能支持String.ToUpper(),但它不支持Char.ToUpper()这正是我需要为这个特定的表和列。但是,感谢您的信息呢!
不隶属于 StackOverflow