我尝试这样做,不包括重复查询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
查询给重复记录
为什么不工作?
我想你想使用的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,但可能会得到你想要的结果。
当比较类实例(与匿名类型),你需要定义“平等”。 对于匿名类型编译器假定平等的意思是“所有领域都是平等的”像SQL一样。 所以,你有几种选择:
- 在查询中使用匿名类型,使用
.Distinct()
并将其转换为一个强类型之后, - 限定
IEqualityComparer<Usuers>
类,并传递到Distinct
, - 覆盖
Equals
(和GetHashCode
中) Usuers
2)和3)将是非常相似的代码。 2)更灵活(你可以通过定义不同的类定义以不同的方式平等,而3)将每当你比较使用Uusers
insatnces(不只是在此查询)。
见我的回答类似的问题在这里 。
注:以下可以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"}
};
}}
}