3

古いサードパーティのデータベースに接続してデータを取得しようとしていて、現在は廃止されているテキスト フィールドを使用しているため、問題が発生しています。ただし、データベース フィールドを変更できないため、LINQ を介してデータを返そうとすると問題が発生します。以下のコード例:

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
            };

最終的にこれを行う前に、この情報に対してさらにフィルタリングを行います。

        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);

上記の例外を取得します。各ユーザーが各検索のすべてのレコードを取得した場合、サーバーの帯域幅にパフォーマンス ヒットがあるため、最初に SQL ステートメント全体を実行し、結果を返してから Distinct を実行する必要はありません。データが返されます。

何か案は?

4

2 に答える 2

2

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

1つのアイデアはDistinct()、SQLでそれを行うようなものを書かないことかもしれません。データを具体的なオブジェクトのセットにクエリしてから、LINQtoObjectsを使用してを試行できます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>ます。個別を機能させるには、クラスをオーバーライドする必要がある場合がありますが、リターンは単純に次のようになりEquals()ます。VacancySummary

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

更新:同じ問題に関する他の質問で行ったように、これにアプローチする必要があるようです。

更新2: Entity Frameworkのモデル定義関数について聞いたことがありますか?この記事をチェックしてください。text概念関数を作成できます(たとえば、列をvarchar(max)(ie )に変換する方法を知っている関数CONVERT(varchar(max), PlacementNotes))。次に、生成されたSQLに含まれるLINQクエリで使用するコードを作成できます。それがあなたのために働くかどうかはわかりませんが、おそらく一撃の価値があります!

于 2012-04-20T14:11:20.863 に答える
1

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

于 2012-04-20T14:09:37.713 に答える