2012-04-20 65 views
3

現在使用していないテキストフィールドを使用してデータに接続してデータを取得しようとする古いサードパーティデータベースがあるため、問題があります。しかし、私はLINQを介してデータを返そうとすると私の問題を引き起こしているので、データベースフィールドを変更することはできません。テキストデータ型を比較できないため、DISTINCTとして選択することはできません

 return query.Select(x => new VacancySummary 
     { 
      Id = x.Id, 
      Departments = "", 
      Location = x.Location, 
      Company = x.Company, 
      DateOpened = x.DateOpened, 
      Notes = x.Notes, 
      Closed = x.Closed 
     }).Distinct().Skip(skip).Take(take); 

そして、上記の例外を取得:以下のコード例:私は最終的にこれをしようとする前に

var query = from s in db.tSearches 
      join c in db.tCompanies on s.CompanyGUID equals c.GUID 
      join cl in db.tCompanyLocations on s.LocationGUID equals cl.GUID 
      join st in db.tSearchTypes on s.SearchTypeGUID equals st.GUID 
      where s.DateClosed == null       
      select new 
      { 
       Id = s.GUID, 
       Type = st.GUID, 
       Location = cl.LocationName, 
       Company = (s.Confidential) ? String.Empty : c.CompanyName, 
       DateOpened = s.DateOpened, 
       Notes = s.PlacementNotes, 
       Closed = s.DateClosed != null 
      }; 

いくつかのより多くのフィルタリングは、この情報に行われます。私はむしろ、SQL文全体を最初に実行し、その結果を返す前にDistinctを実行する必要はありません。なぜなら、各ユーザが各検索のすべてのレコードを取得した場合、サーバの帯域幅でパフォーマンスが低下するからです。データが返されます。

アイデア?

+0

非推奨の場合、なぜそのフィールドをプルしないのですか? – JNK

+1

@ kh25:そのデータベースにビューを作成できますか? 'text'カラムを' varchar(max) 'に変換し、次にLINQでビューからクエリすることを除いて、' text'カラムを持つテーブルの上にビューを作成することをお勧めします。 –

+1

[EF:text data typeはDISTINCTとして選択できません。これは比較できません](http://stackoverflow.com/questions/8056339/ef-the-text-data-type-cannot-be-selected -as-distinct-because-not-not-comparab) –

答えて

1

linqユーザーではありませんが、tsqlではこれを同等のvarcharにキャストします。 ToString()またはExpression.Convertを使用して試してください。必要に応じて、フィールドが8000文字を超えるような場合は切り捨てます。

2

どの列がtextタイプですか?

考えてみると、Distinct()はSQLで書かれているように書くのが良いでしょう。具体的なオブジェクトセットにデータを照会し、LINQ to Objectsを使用してDistinct()を試すことができます。

あなたが持っているものから始めて、空室の概要のリストにその元のクエリを回す:

var query = (from s in db.tSearches 
      join c in db.tCompanies on s.CompanyGUID equals c.GUID 
      join cl in db.tCompanyLocations on s.LocationGUID equals cl.GUID 
      join st in db.tSearchTypes on s.SearchTypeGUID equals st.GUID 
      where s.DateClosed == null       
      select new VacancySummary() 
      { 
       Id = s.GUID, 
       Departments = string.Empty, 
       Type = st.GUID, 
       Location = cl.LocationName, 
       Company = (s.Confidential) ? String.Empty : c.CompanyName, 
       DateOpened = s.DateOpened, 
       Notes = s.PlacementNotes, 
       Closed = s.DateClosed != null 
      }).ToList(); 

あなたqueryオブジェクトは今List<VacancySummary>の代わりIQueryable<anonymous type>になります。あなたがin your other question about the same issueをしたとして、これをアプローチする必要がありますように見える:UPDATE

return query.Distinct().Skip(skip).Take(take); 

:あなたは異なったが動作するためには、あなたのVacancySummaryクラスにEquals()を上書きする必要があるかもしれませんが、あなたのリターンは単純になります。

更新2: Entity Frameworkのモデル定義関数について聞いたことがありますか?チェックアウト:this article概念的な関数(例えば、text列を(つまりCONVERT(varchar(max), PlacementNotes))に変換する方法を知っている関数)を作成できます。生成されたSQLに含まれるLINQクエリで使用するコードを作成できます。それはあなたのために働くかどうか分かりませんが、多分ショットの価値があるでしょう!

+0

ありがとう@Cory - PlacementNotesは違反者です。私は、Skip and Takeの前にToList()を実行するのを防ぐために、各ユーザーに返されるデータ量の膨大な差異があるため(これは、顧客に課金される可能性があります。彼らが戻っているデータの)。これが不可能な場合は、初期クエリを2つの別々のクエリに分割します。 – kh25

+1

@ kh25:PlacementNotesをクエリから完全に離しておき、後で 'tSearches.GUID'(VacancySummary.Id)でそれを調べることができます。 –

+0

それは実際には、データベースに1つのヒットで必要なことをする方法がない場合、行く方法のように見えます。私がその解決策をとるならば、後で詳細を投稿します。 – kh25

関連する問題