C#-foreach循环在具有多个记录的Linq查询后仅返回第一条记录
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-foreach循环在具有多个记录的Linq查询后仅返回第一条记录,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2665字,纯文字阅读大概需要4分钟。
内容图文
我有一个对第三方提供的数据库运行的Linq2SQL查询.查询的主要部分如下所示:
var valuationQuery =
from v in context.Valuations
where v.ModelId == QualifiedModelId.ModelId
&& v.QualifyModelId == QualifiedModelId.Qualifier
&& v.LanguageCode == QualifiedModelId.LanguageCode
&& v.Edition == Data.Meta.Edition.CurrentEdition.Date
&& v.RegDate == yearReg.RegistrationDate
&& v.ValTypeDescription == "Normal"
&& v.MileageBandID == MileageBand
当我使用foreach循环在它周围循环时,它的工作或失败取决于最后的选择.当选择指定所有类似这样的字段时…
select new
{
v.Value1,
v.Value2,
v.Value3,
... snip ...
v.Value14,
v.Value15,
v.ValueTypeID
};
…它正常工作.当我执行以下操作时,循环将迭代正确的时间,但是每次都会带回第一条记录:
select v;
我希望能够在不指定名称的情况下选择所有字段,以防供应商添加更多字段(它们实际上称为“ Value1”到“ Value15”),这意味着我可以在代码中更改一个常量并更新DBML和所有相关代码将从正确数量的字段中查找.这个查询(以及类似的查询)在各个地方都有使用,因此我希望将来能省力!
我已经运行了SQL事件探查器,以确保正在运行的查询返回正确的结果,并且确实如此.
foreach循环是这样的(Convert是由于设计不良的数据库具有非常不一致的数据类型):
foreach (var record in valuationQuery)
{
int CurrentValType = Convert.ToInt32(record.ValueTypeID);
string FieldName = "Value";
if (MPLower.MileagePointID >= 1 && MPLower.MileagePointID <= MaxMileagePoints)
{
FieldName = "Value" + MPLower.MileagePointID.ToString().Trim();
MPLower.MileagePointPounds[CurrentValType] = Convert.ToInt32(record.GetType().GetProperty(FieldName).GetValue(record, null));
}
if (MPHigher.MileagePointID >= 1 && MPHigher.MileagePointID <= MaxMileagePoints)
{
FieldName = "Value" + MPHigher.MileagePointID.ToString().Trim();
MPHigher.MileagePointPounds[CurrentValType] = Convert.ToInt32(record.GetType().GetProperty(FieldName).GetValue(record, null));
}
}
我是C#的新手(我已经继承了一些代码),所以我意识到这可能是我已经完成或未完成的愚蠢事情!有人可以帮忙吗?
解决方法:
身份图
使用ORM时的一个常见问题(好的,也许不完全常见,但是可能会发生)是,您希望返回不同记录的查询最终会返回同一记录的多个副本.这通常是由ORM的身份映射引起的.以下是其正常工作的快速概述.
身份映射本质上是基于每个对象的主键的对象缓存.
当您向ORM询问具有特定主键的记录时,它将检查该记录是否已存在于身份映射中.如果它已经存在,它将返回现有记录.
这通常很方便,但有时会出错.如果两个对象具有相同的主键,或者您尚未指定主键是什么(迫使ORM猜测),则标识映射无法区分它们,并且始终会返回第一个.
这个故事的寓意是,如果看到同一条记录的多个副本,那么请始终仔细检查您的主键!
在这个问题中,代码
select new
{
v.Value1,
v.Value2,
v.Value3,
... snip ...
v.Value14,
v.Value15,
v.ValueTypeID
};
之所以起作用,是因为您正在使用select new {}投影来返回匿名类型,该类型绕过身份映射.
select v
直接选择对象,这确实使用了身份映射,从而导致了您所看到的问题.
内容总结
以上是互联网集市为您收集整理的C#-foreach循环在具有多个记录的Linq查询后仅返回第一条记录全部内容,希望文章能够帮你解决C#-foreach循环在具有多个记录的Linq查询后仅返回第一条记录所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。