0

データを取得するために必要なテーブルが2つあります...部屋と住所。RoomsテーブルにはAddressIDフィールドが含まれていますが、nullの可能性があるため、関係は0から1です。特定のRoomとアドレス情報(存在する場合)を返すLINQステートメントを作成しようとしています。私のモデルは次のように定義されています:

public partial class Room
{
    public Room()
    {
        this.Address = new HashSet<Address>();
    }

    public int RoomID { get; set; }
    public Nullable<int> AddressID { get; set; }
    public string Comments { get; set; }
    public string Notes { get; set; }

    public virtual ICollection<Address> Address { get; set; }
}

linqステートメントで.Include( "Address")を使用しようとしましたが、機能しませんでした。これは、Joinステートメントが原因であると考えられます(使用すると、黙ってインクルードが削除されます)。

これは醜い方法ですが、もっと良い方法があることを私は知っています:

var csdDB = new CSDContext(CustomerCode);

IList<Room> rooms = (from r in csdDB.Rooms
                        join sr in csdDB.SiteRooms
                            on r.RoomID equals sr.RoomID
                        where sr.SiteID == id
                        orderby r.RoomName
                        select r).ToList<Room>();

int? addressID = rooms.FirstOrDefault<Room>().AddressID;

if (addressID != null)
{
    IList<Address> address = (from a in csdDB.Addresses
                                where a.AddressID == addressID
                                select a).ToList<Address>();

    rooms.FirstOrDefault<Room>().Address = address;
}

結果に対して直接フィルタリングを実行しようとしました。

IList<Address> address = (from a in csdDB.Addresses
                            where a.AddressID == rooms.FirstOrDefault().AddressID
                            select a).ToList<Address>();

しかし、それはエラーをスローします:

Unable to create a constant value of type 'Models.CSD.Room'. Only primitive types or enumeration types are supported in this context.

これをよりクリーン/より良いものにする方法についての提案は大歓迎です!

4

1 に答える 1

0

LINQに左結合を組み込むと、次のようになります。

var results = (from r in csdDB.Rooms
               join sr in csdDB.SiteRooms
                   on r.RoomID equals sr.RoomID && sr.SiteID equals id
               join addr in csdDB.Addresses
                   on r.AddressID equals addr.AddressID into roomAddrs
               from roomAddr in roomAddrs.DefaultIfEmpty(new Address())
               select new 
               {
                   Room = r,
                   Address = roomAddr
               }
于 2013-01-17T21:35:33.997 に答える