Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 填充包含其他列表中的值的对象_C#_Linq - Fatal编程技术网

C# 填充包含其他列表中的值的对象

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)中有

在我的对象中,我有3个属性:

    public String PlaceName{ get; set; }
    public Int32 PlaceId { get; set; }
    public Boolean IsChecked { get; set; }
我有一个结果,其中5行是从我的数据库(SQLPlaceALL)返回的

  • 放置
  • 地点B
  • 地点C
  • 地点D
  • 地点E
这5个结果我一直想显示。但是,当我选择联系人时,该联系人可能在返回的结果(sqlPlaceResults)中有一个或多个位置

  • 地点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
                           };
    
执行此操作时,popPlace仅包含sqlPlaceResults包含的3项。我希望我的显示器可以执行以下操作:

  • 放置
  • 放置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()?