C# 填充包含其他列表中的值的对象
在我的对象中,我有3个属性:C# 填充包含其他列表中的值的对象,c#,linq,C#,Linq,在我的对象中,我有3个属性: public String PlaceName{ get; set; } public Int32 PlaceId { get; set; } public Boolean IsChecked { get; set; } 我有一个结果,其中5行是从我的数据库(SQLPlaceALL)返回的 放置 地点B 地点C 地点D 地点E 这5个结果我一直想显示。但是,当我选择联系人时,该联系人可能在返回的结果(sqlPlaceResults)中有
public String PlaceName{ get; set; }
public Int32 PlaceId { get; set; }
public Boolean IsChecked { get; set; }
我有一个结果,其中5行是从我的数据库(SQLPlaceALL)返回的
- 放置
- 地点B
- 地点C
- 地点D
- 地点E
- 地点B
- 地点C
- 地点D
var popPlace = from places in sqlPlaceResults.AsEnumerable() join placeAll in sqlPlaceResultsAll.AsEnumerable() on places["PLACEID"] equals placeAll["PLACEID"] select new Place { PlaceName = places["NAME"].ToString(), PlaceId = (Int32)places["PLACEID"], Ischecked = true };
- 放置
- 放置B-选中
- 放置C-选中
- 放置D-选中
- 地点E
左连接
下面是您的代码修改为与本文类似的内容:
var popPlace =
from places in sqlPlaceResults.AsEnumerable()
join placeAll in sqlPlaceResultsAll.AsEnumerable()
on places["PLACEID"] equals placeAll["PLACEID"] into placeAllVals
from sub in placeAllVals.DefaultIfEmpty()
select new Place
{
PlaceName = regions["NAME"].ToString(),
PlaceId = (Int32)regions["PLACEID"],
Ischecked = sub != null
};
这样的办法应该行得通。您希望查询所有位置,并根据是否存在任何匹配的sqlPlaceResults
设置IsChecked
var popPlace =
from placeAll in sqlPlaceResultsAll.AsEnumerable()
select new Place
{
placeName = regions["NAME"].ToString(),
PlaceId = (Int32)regions["PLACEID"],
Ischecked = sqlPlaceResults.AsEnumerable().Any(
places => places["PLACEID"] == placeAll["PLACEID"])
};
这仍然只返回1个resultYah,它的行为类似于左连接。所以,如果你把两边倒过来,肯定会有不同,我喜欢这个答案。这似乎是一个比左连接更快的查询,您对这个解决方案和左连接的性能有什么看法吗?(来自SLC的您好:)@paqogomez:除非您已经确定性能是一个问题,否则您应该更加关注可读性;对我来说,这比左连接可读得多。但是是的,这很可能比左连接的性能稍好一些,因为一旦确定存在匹配的位置,它就可以停止搜索。但这假设了比我实际知道的更多的支持数据结构——例如,为什么我们要说.AsEnumerable()?