如何将LINQ to SQL Distinct()运算符应用于List ?
|
我在LINQ to SQL中遇到严重的问题(这使我发疯了)。我正在Visual Studio 2010中使用c#和Razor开发ASP.NET MVC3应用程序。
我有两个数据库表,产品和类别:
产品(Prod_Id [主键],其他属性)
类别((Dept_Id,Prod_Id)[主键],其他属性)
显然,类别中的Prod_Id是外键。这两个类均使用实体框架(EF)进行映射。为了简单起见,我没有提及应用程序的上下文。
在类别中,有多行包含Prod_Id。我想对所有类别中的不同Prod_Id进行投影。我根据以下(非常简单的)查询在SQL Server MGMT Studio中使用普通(T)SQL进行了此操作:
SELECT DISTINCT Prod_Id
FROM Categories
结果是正确的。现在,我需要在应用程序中进行此查询,因此我使用了:
var query = _StoreDB.Categories.Select(m => m.Prod_Id).Distinct();
我使用以下方法检查查询结果:
query.Select(m => m.Prod_Id);
要么
foreach(var item in query)
{
item.Prod_Id;
//other instructions
}
它不起作用。首先,当我尝试编写query.Select(m => m.
或item.
时,Intellisense仅显示有关方法的建议(例如Equals等),而不是属性。我以为Intellisense可能有问题(我想大多数人都希望Intellisense是错误的:-D),但是当我启动应用程序时,我在运行时收到错误消息。
在给出答案之前,请记住:
1)我检查了很多论坛,我尝试了普通的LINQ to SQL(不使用lambdas),但是它不起作用。它在(T)SQL中起作用的事实意味着LINQ to SQL指令存在问题(我的应用程序中的其他查询可以正常工作)。
2)由于与应用程序相关的原因,我使用了一个List<T>
变量而不是_StoreDB.Categories,我认为这就是问题所在。如果您能为我提供不使用ѭ6的解决方案,也将不胜感激。
谢谢你的回答
弗朗切斯科
没有找到相关结果
已邀请:
3 个回复
黎喊病
您的LINQ查询最有可能返回
的IEnumerable ...(以
判断)。您具有整数列表,而不是实体对象列表。尝试打印它们,然后看得到什么。
春驹晴陪
意味着
将仅包含
值,而不包含整个实体。这将大致等效于此SQL,该SQL仅选择一列(而不是整个行):
因此,当您使用
遍历
时,
的类型可能是
(或任何您的
列),而不是您的实体。这就是为什么Intellisense不显示您键入\“
\”时期望的实体属性的原因... 如果要将want21ѭ中的所有列都包含在
中,则甚至不需要使用
。您可以这样做:
请注意,如果您未将
显式传递给
,则将使用
(取决于
的类型,是否实现
,其行为可能与您想要的方式不同)。 。 有关使30英镑在与您相似的情况下工作的更多信息,请查看此问题或相关问题以及相关讨论。
磁辫覆氓
然后,我们将使用join,如下所示:
这将获取查询,将其与Products表连接,指定要使用的键,最后说要从每个匹配集中返回Product实体。因为我们知道查询中的Prod_Id是唯一的(因为Distinct()),而产品中的Prod_Ids是唯一的(根据定义,因为它是主键),所以我们知道结果将是唯一的,而不必调用Distinct() 。 现在,以上方法将获得理想的结果,但是绝对不是最干净或最简单的方法。如果使用关联属性定义Category实体,该属性从Products返回相关记录(可能会称为Product),则执行我们要执行的操作的最简单方法如下:
这将从每个类别中获取产品,并返回它们的不同集合。 如果Category实体不具有Product关系属性,那么我们可以返回使用Join函数来获取我们的Products。
最后,如果我们不只是想要一个简单的产品集合,那么就必须进行更多的研究,也许最简单的事情是在遍历产品时进行处理。另一个示例是获取每个产品所属类别的数量的计数。如果是这种情况,我将颠倒逻辑并从Products开始,如下所示:
这将导致一个匿名类型的对象的集合,这些对象引用该产品以及与该产品相关的NumberOfCategories。如果我们仍然需要排除任何未修饰的产品,则可以在分号前附加ѭ36。当然,如果使用相关类别的关系属性定义了Product实体,则不需要此属性,因为您可以选择任何Product并执行以下操作:
无论如何,对不起,您不满意。我希望这对遇到类似问题的其他人有帮助。 ;)