6

IdUser繰り返される値を含まないクエリを実行しようとしていますが、機能しません。

これは私のlinqクエリです:

var sql= (from u in db.USER
          join c in db.CONSULT on u.IdUser equals c.IdUser 
          select new UsuersViewModel 
                 {  
                    IdUser = c.IdUser, 
                    DateCreate=c.DateCreate, 
                    IdTypeConsult = c.IdTypeConsult, 
                    Sex=u.Sex 
                 })
                 .Distinct();

これ欲しい:

SELECT   distinct CONSULT.IdUser , CONSULT.DateCreate, 
         CONSULT.IdTypeConsult , USER.Sex
FROM   CONSULT INNER JOIN
       USER ON CONSULT.IdUser = USER.IdUser 

クエリは重複したレコードを提供します

なぜそれが機能しないのですか?

4

3 に答える 3

7

オーバーロードを使用したいと思いますDistinct(IEqualityComparer<T>)。必要なことIEqualityComparerを行うには、 を作成する必要があります。

class UserComparer : IEqualityComparer<UsuersViewModel >
{
    public bool Equals(UsuersViewModel  x, UsuersViewModel y)
    {
        //Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether any of the compared objects is null.
        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        return x.IdUser == y.IdUser;
    }

    // If Equals() returns true for a pair of objects 
    // then GetHashCode() must return the same value for these objects.

    public int GetHashCode(UsuersViewModel  user)
    {
        //Check whether the object is null
        if (Object.ReferenceEquals(user, null)) return 0;

        return user.IdUser == null ? 0 : user.IdUser.GetHashCode();
    }
}

次に、次のように使用します。

var comparer = new UserComparer();
var sql= (from u in db.USER
          join c in db.CONSULT on u.IdUser equals c.IdUser 
          select new UsuersViewModel 
                 {  
                    IdUser = c.IdUser, 
                    DateCreate=c.DateCreate, 
                    IdTypeConsult = c.IdTypeConsult, 
                    Sex=u.Sex 
                 })
                 .Distinct(comparer);

必要な SQL が生成されるかどうかはわかりませんが、必要な結果が得られる可能性があります。

于 2012-07-26T16:27:00.287 に答える
2

クラスインスタンス(匿名タイプと)を比較するときは、「同等性」を定義する必要があります。匿名型の場合、コンパイラは、SQLと同様に、等しいとは「すべてのフィールドが等しい」ことを意味すると想定します。したがって、いくつかの選択肢があります。

  1. クエリで匿名型を使用し、を使用.Distinct()して、後で強力な型に変換します。
  2. IEqualityComparer<Usuers>クラスを定義し、それをDistinctに渡します。
  3. でオーバーライドEquals(およびGetHashCodeUsuers

2)と3)は非常によく似たコードになります。2)より柔軟です(さまざまなクラスを定義することでさまざまな方法で平等を定義できますが、3)不満を比較するときは常にUusers(このクエリだけでなく)使用されます。

ここで同様の問題に対する私の答えを参照してください。

于 2012-07-26T16:24:46.127 に答える
0

注: 以下は、LinqPad ( http://www.linqpad.net/で無料) で実行できます。[言語] ドロップダウンを [C# プログラム] に設定し、コードをエディター ウィンドウに貼り付けるだけです。

次のように、「グループ」を使用して個別の要件を提供できます。

void Main()
{
    var db = new DataBase();
    var sql= (from u in db.USER
          join c in db.CONSULT on u.IdUser equals c.IdUser 
          group c by new { c.IdUser, c.DateCreate, c.IdTypeConsult, u.Sex } into gc
          select new UsuersViewModel 
                 {  
                    IdUser = gc.Key.IdUser, 
                    DateCreate=gc.Key.DateCreate, 
                    IdTypeConsult = gc.Key.IdTypeConsult, 
                    Sex=gc.Key.Sex 
                 })
                 .Distinct();
    sql.Dump("SQL Distinct Demo");
}
public class Consultation {
    public int  IdUser {get;set;}
    public DateTime DateCreate {get;set;}
    public int IdTypeConsult {get;set;}
}
public class UsuersViewModel : Consultation {
    public string Sex {get;set;}
}
public class DataBase {
    public IEnumerable<Consultation> CONSULT {
        get { 
            return new List<Consultation>{
                new Consultation { IdUser = 1, DateCreate=DateTime.Today, IdTypeConsult = 2},
                new Consultation { IdUser = 2, DateCreate=DateTime.Today.AddDays(1), IdTypeConsult = 4}
            };
        }}
    public IEnumerable<UsuersViewModel> USER {
        get {
            return new List<UsuersViewModel>{
                new UsuersViewModel { IdUser = 1, Sex="M"},
                new UsuersViewModel { IdUser = 1, Sex="M"},
                new UsuersViewModel { IdUser = 2, Sex="F"},
                new UsuersViewModel { IdUser = 2, Sex="F"}
            };
        }}
}

結果は次のとおりです。

于 2014-03-14T13:06:10.153 に答える