1

アプリに検索機能があります。それが機能する方法は、ユーザーがレコードをプルアップし、レコードから名、姓、生年月日をLINQクエリに渡す検索ボタンをキット化することです。LINQクエリは、一致する可能性のあるものを提供することになっています。今のところ、それはあまりにも多くの結果をもたらします。生年月日を正確に一致させたいのですが、名前と名前の一致が多少緩くなる可能性があります。完璧な世界では、結果は次のようになります。

  1. DOBと完全に一致
  2. 名にあいまい一致
  3. 厳密ではありませんが、名前に一致します。

たとえば、1974年11月27日生まれのJames Mayを検索している場合、次のような結果が必要です。

ジム1974年5月11/27
ジャック1974年5月11/27ジェームスメイフォード1974年11月27日

最良の方法はストアドプロシージャであることを知っていますが、それを試してみました。ストアドProcをプロジェクトに追加するたびに、EDMXファイルが破損したため、LINQでそれを実行できなくなりました。

これが私がこれまでに持っているものです:

        var query = from p in _Elig_DB.PersonAttributes.ToList()
                    where   p.getDateOfBirth == DOB &&
                                    p.FirstName.Contains(FName) || p.FirstName.StartsWith(FName) &&
                                    p.LastName.Contains(LName) || p.LastName.StartsWith(LName)

                    select p;

これにより、次のような結果が得られます。

Ileana   May         10/30/1967
Kristina May         4/23/1971
margaret Mayberry    7/26/1942
Karla    Mayorga     5/14/1986
Stan     Mayer       3/8/1952
Lori     Maynard     7/22/1965

したがって、姓は良いですが、生年月日はそのように変わるべきではありません。読んでくれてありがとう。

4

2 に答える 2

1

かっこを修正するだけです。

    var query = from p in _Elig_DB.PersonAttributes.ToList()
                where   p.getDateOfBirth == DOB &&
                                (p.FirstName.Contains(FName) || p.FirstName.StartsWith(FName) &&
                                p.LastName.Contains(LName) || p.LastName.StartsWith(LName))

                select p;
于 2012-11-19T22:08:22.943 に答える
0

申し訳ありませんが、まだコメントを追加できませんが、データベースからデータを取得するときにクエリがwhereフィルターを使用していないことを追加したいと思います。

現時点では、次のSQLまたは同等のものがデータベースで実行されます。

select * _Elig_DB.PersonAttributes

テーブルのすべての行がエンティティオブジェクトに新しくなります。その場合にのみ、ステートメントのwhere部分がエンティティに対して実行され、不要な結果は無視されます。

これは意図的ではなく、最初のクエリを最適化することをお勧めします。

これが発生する理由は、linqステートメントのfrom部分に.ToList()ステートメントがあるためです。tolistステートメントは、クエリをすぐに実行し、オブジェクトのリストを作成するように強制します。

ステートメントを(tolistなしで)に変更した場合:

var query = from p in _Elig_DB.PersonAttributes
            where   p.getDateOfBirth == DOB &&
                            (p.FirstName.Contains(FName) || p.FirstName.StartsWith(FName) &&
                            p.LastName.Contains(LName) || p.LastName.StartsWith(LName))

            select p;

この時点では、クエリはデータをフェッチしていません。(明示的なvarクエリタイプはQueryableであることに注意してください)これで、必要なデータベース行をフェッチするだけで完全なクエリを実行できます。

var results = query.ToList();
于 2012-11-22T10:11:44.840 に答える