3

LinqtoSqlを使用してデータベースにクエリを実行しています。これが私のデータです:

     Name      LastName        Age
    ------------------------------
1    Abc         Def            15
2    Abc         Def            17
3    xyz         wss            17

私のLinqtoSqlコードは次のとおりです。

Context _context = new Context("Conn_String");
var table = _context.GetTable<Person>();
List<Person> persons = table.Where<Person>(p => p.Name == "Abc" && p.LastName == "Def").ToList<Person>();

私の理解によると、このクエリは2つのレコードを返すはずです。つまり、レコード1とレコード2です。ただし、レコード1を2回返しています。それがLinqtoSqlのバグであるか、私が間違っていることであるかどうかを教えてもらえますか?

編集:

これは私のDALコードです:

public List<T> GetList<T>(Expression<Func<T, bool>> predicate) where T : class
{
     try
     {
          Context _context = new Context("Conn_String");
          var table = _context.GetTable<T>();
          return table.Where<T>(predicate).ToList<T>();
      }
      catch (Exception ex)
      {
           throw ex;
      }
 }

私はこのメソッドを次のように呼んでいます:

List<Person> person = DAL.GetList<Person>(p => p.Name == "Abc" && p.LastName == "Def");

foreach(var Person in persons )
{
    // Print(person.Age);
}
4

4 に答える 4

7

私はこの問題に自分で遭遇しました。モデルがPersonクラスのエンティティキーであると推測したプロパティを確認します。

エンティティキーとして一意でない列がある場合、ToList()を使用して変換するときに、各行の値と一致する最初の行が使用されます。

于 2013-10-31T02:16:52.183 に答える
2

簡単に言うと、フェッチするデータに主キーを追加する必要があります。

ビューselectステートメントに一意の列を追加するだけです。プログラムでその列を使用する必要はありませんが、EFが各オブジェクトを適切に構築できるようになります。

質問は2012年11月に行われ、私は2019年7月に回答していますが、詳細な回答は以下のソースで入手できます。私は多分何かがそこに誰かを助けるかもしれないと答えています。

動作中のSQLビューから重複行を返す.NETのLINQhttps ://www.itworld.com/article/2833108/linq-in--net-returning-duplicate-rows-from-a-working-sql-view--解決済み-.html

于 2019-07-11T07:35:45.697 に答える
1

クエリを実行し、データベースでSQL Serverプロファイラー(SQL Serverを想定)を使用してプロファイリングできますか?テーブルに重複するレコードがあるかどうか、または重複を引き起こす結合があるかどうか疑問に思っています。

LINQtoSQLを問題なく使用しました。

データベースプロファイルが正しく表示され、「強制的に」一意にしたい場合は、最後にLINQクエリでいつでも個別のメソッドを渡すことができます。

于 2012-11-18T18:46:36.853 に答える
1

こんにちはUsman、

これは私のテーブルです:

ここに画像の説明を入力してください

ここで私は次のクエリを使用しています:

   using (DataClassesDataContext dc = new DataClassesDataContext())
        {
            var v = (from c in dc.t_controls where (c.config_display == "SHOW_VA" && c.next_value == 1) select c.description).ToList();
        }

このクエリは5行すべてを返します。これを参照して、どこが間違っているかを確認してください。お役に立てば幸いです。

于 2012-11-19T05:29:25.943 に答える