2017-09-13 32 views
-3

我有这个疑问如何使用包含在左外连接的Linq

  from Room in PMSdb.Room_Tbl 
       join Res in PMSdb.Reservation_Tbl on 
       Room.Room_ID equals Res.Room_ID 
       into ej 
       from Res in ej.DefaultIfEmpty() 
       join Feature in PMSdb.Room_Features_Tbl on 
       Room.Room_Features.Split(',').Contains(Feature.Room_Features_ID.ToString()) 
       into FE 
       from Feature in FE.DefaultIfEmpty() 
        select new 
           { 
            Room = Room.Room_Number, 
            Room_type = RoomType.Room_Type_Code 
            Feature =Feature.Feature_Name} 

我需要这样做 Room.Room_Features.Split(',').Contains(Feature.Room_Features_ID.ToString())但它拒绝 我怎么能这样做?

+1

因此'Room_Features'是一个以逗号分隔的功能列表?如果是这样,简短的答案是'不这样做'。您应该改为具有两个栏目(Room_ID和Feature_ID)的“RoomFeatures”表格,以便您可以在Room和Feature之间建立多对多的关系。 – mjwills

+0

@GertArnold如何创建一个变量首先如你所说?因为我没有它,它动态地获取编译 –

+0

@mjwills错误'错误预计上下文关键字“等于” \t ' –

回答

-2

如何:

(from Room in PMSdb.Room_Tbl 
      join Res in PMSdb.Reservation_Tbl on 
      Room.Room_ID equals Res.Room_ID 
      into ej 
      from Res in ej.DefaultIfEmpty() 
      select new { room = Room, res = Res) 
      .Where(x => x.Res == null) 
      .Select(x => new { 
          Room = x.room.Room_Number, 
          Room_type = x.room.Room_Type_Code, 
          Features = x.room.Room_Features.Split(new char[] {','}) 
           .Select(y => PMSdb.Room_Features_Tbl.Where(z => z.Room_Features_ID.ToString() == y.Trim()).FirstOrDefault()) 
           .ToList() 
      }).ToList(); 
+0

“Contains”发生了什么?这在逻辑上是不同的。而EF6不会接受'String.Split'。不幸的是,OP没有告诉他们实际使用了哪个ORM。 –

+0

@JdWeng哪里是Room_Feature表?我想从中选择 –

+0

是不是它的一部分:PMSdb.Room_Tbl中的房间? – jdweng

0

你真的应该考虑使用结合表正常化的数据,以逗号分隔的字段是坏的数据库设计的一个标志。

这就是说,问题是实体框架无法将string.Split()转换为SQL查询。

如果您的数据存储为,val1,val2,,val3,(因此前缀并用逗号后缀和逗号无效的值),你可以求助于string.Contains,这可以被翻译成SQL:

Room.Room_Features.Contains($",{Feature.Room_Features_ID},") 
+0

OP可能没有改变现有数据库的选择,所以你的推荐是无用的 – jdweng

+1

@jdweng bugger off随着你的复仇降临,许多人向你解释了多次“尝试这个[代码块]”并不是一个好的答案,正如[答案]中所解释的。除此之外,我的答案确实包含了一个不需要数据库结构的解决方案要改变,尝试阅读超出第一句话。 – CodeCaster