LINQ选择不同的c#

kal*_*alu 6 c# linq-to-sql

我正在尝试执行不包含重复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();
Run Code Online (Sandbox Code Playgroud)

我要这个:

SELECT   distinct CONSULT.IdUser , CONSULT.DateCreate, 
         CONSULT.IdTypeConsult , USER.Sex
FROM   CONSULT INNER JOIN
       USER ON CONSULT.IdUser = USER.IdUser 
Run Code Online (Sandbox Code Playgroud)

该查询提供重复的记录

为什么不起作用?

Pet*_*hie 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

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);
Run Code Online (Sandbox Code Playgroud)

我不确定这是否会生成您想要的SQL,但可能会得到您想要的结果.


D S*_*ley 2

在比较类实例(与匿名类型)时,您需要定义“相等”。对于匿名类型,编译器假定相等意味着“所有字段都相等”,就像 SQL 那样。所以你有几个选择:

  1. 在查询中使用匿名类型,然后使用.Distinct(),然后转换为强类型,
  2. 定义一个IEqualityComparer<Usuers>类并将其传递给Distinct,
  3. 覆盖Equals(和GetHashCodeUsuers

2) 和 3) 是非常相似的代码。2)更灵活(您可以通过定义不同的类以不同的方式定义相等性,而3)将在您比较insatnces时使用Uusers(不仅仅是在这个查询中)。

请参阅我对类似问题的回答。