2011-01-17 6 views
2

このコードは私に迷惑をかけていますこのコードは不明ですが、コードの臭いがあります!

別のオブジェクトEventDistanceを作成しましたが、おそらくそれは必要ではないと思われます。距離はイベントの部分クラスに追加したプロパティです。基本的には、すべてのイベントを返信し、距離順に並べ替える必要があります。

私はforeachの余分なラウンドがおそらく必要ではないと考えています。

public IQueryable<Event> FindByLocation(float latitude, float longitude) 
     { 

      var eventsList = from ev in GetAllEvents() 
          join i in db.NearestEvents(latitude, longitude) 
          on ev.ID equals i.ID 
          select new EventDistance() { TheEvent = ev, Distance = i.Distance }; 


      foreach (var item in eventsList) 
      { 
       item.TheEvent.Distance = item.Distance; 
      } 
      return eventsList.OrderBy(e => e.Distance).Select(e => e.TheEvent); 
     } 

答えて

1

私に見えるものから、EventDistanceクラスは必要ありません。単にそれを省略して、あなたのLINQの式の中で任意の型を指定しないことによって、匿名型を使用します。

public IQueryable<Event> FindByLocation(float latitude, float longitude) 
    { 

     var eventsList = from ev in GetAllEvents() 
         join i in db.NearestEvents(latitude, longitude) 
         on ev.ID equals i.ID 
         select new { TheEvent = ev, Distance = i.Distance }; 


     foreach (var item in eventsList) 
     { 
      item.TheEvent.Distance = item.Distance; 
     } 
     return eventsList.OrderBy(e => e.Distance).Select(e => e.TheEvent); 
    } 
1

私はLINQの構文で無知だけど、それは本当に最初に距離値を移入することは可能であるべきselect。何かのように

var eventsList = from ev in GetAllEvents() 
       join i in db.NearestEvents(latitude, longitude) 
       on ev.ID equals i.ID 
       orderby i.Distance 
       select (ev => { ev.Distance = i.Distance; return ev; }); 

?または、

var eventsList = GetAllEvents() 
       .Join(db.NearestEvents(latitude, longitude), 
         ev => ev.ID, 
         i => i.ID, 
         (ev, i) => { ev.Distance = i.Distance; return ev; }) 
       .OrderBy(ev => ev.Distance); 

N.B. :-)適切に書かれましたこれ以降のqstarinコメントは、SQLとして評価されるORMオブジェクトではなく、この時点でオブジェクトに作用している場合にのみ可能です。それは言った、あなたはおそらくまだ

  1. 初期にORDERBYを行うことができますにオブジェクトを結合する単一の選択を使用し
  2. (私はこれを行うための最善の方法を忘れてしまった)メモリにオブジェクトを強制
  3. をフェッチEventオブジェクト上記のようにではなく、ループ
+0

LINQ式がSQLに変換しようとするプロバイダによって処理されている場合、これはおそらく機能しません。メモリ内のオブジェクトに対して発生する場合、それは動作するはずです。 –

+0

@qstarin oops、はい、良い点。 – Rup

+0

re#2、選択/投影(または必要な場合)の前に.ToList()を挿入すると、IQueryableの評価が強制され、DBオブジェクトがロードされます。 –

1

あなたがのIQueryableとして、それを維持したい場合は、あなたがこれを行うことができます。

 public IQueryable<Event> FindByLocation(float latitude, float longitude) 
     { 

      return from ev in GetAllEvents() 
        join i in db.NearestEvents(latitude, longitude) 
        on ev.ID equals i.ID 
        order by i.Distance 
        select ev; 
     } 

GetAllEvents()メソッドがIQueryableを返す限り、そうです。

編集:私は今実際に以下のRupの提案を試しました。このメソッドでdb呼び出しを呼び出さずにIQueryableを返すことができるはずです。このように:

 public IQueryable<EventDistance> FindByLocation(float latitude, float longitude) 
     { 
       return from ev in GetAllEvents() 
        join i in db.NearestEvents(latitude, longitude) 
        on ev.ID equals i.ID 
        orderby i.Distance 
        select new EventDistance 
        { 
         Event = ev, 
         Distance = i.Distance 
        }; 
     } 

EventDistanceクラスはマッピングする必要はありません。

+0

しかし、あなたはi.Distanceプロパティを失ってしまっています - 彼の例では、それをイベントオブジェクトに保存して戻ります。 – Rup

+0

Woops ...はい、そうです:) – asgerhallas

+2

あなたのメソッドを '新しいEventDistance(){TheEvent = ev、Distance = i.Distance}を選択するように変更するのが最善の答えだと思っています。 'IQueryable 'を返します - それはうまくいくでしょうか?私は、データレイヤーが知っているオブジェクトではないので、それはうまくいきません。マッピングするためのレシピがあるものですが、私は今、正しく混乱している。 – Rup

1

このようなことはできますか?

関連する問題