And*_*air 14 .net c# linq-to-entities entity-framework c#-3.0
早上好!
鉴于:
public class FooClass
{
public void FooMethod()
{
using (var myEntity = new MyEntity)
{
var result = myEntity.MyDomainEntity.Where(myDomainEntity => myDomainEntity.MySpecialID > default(int)).Distinct(new FooComparer);
}
}
}
public class FooComparer : IEqualityComparer<MyEntity.MyDomainEntity>
{
public bool Equals(MyEntity.MyDomainEntity x, MyEntity.MyDomainEntity y)
{
return x.MySpecialID == y.MySpecialID;
}
public int GetHashCode(MyEntity.MyDomainEntity obj)
{
return obj.MySpecialID.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
这将编译,但在运行时我将得到一个Linq to Entity could not translate Comparer
-Exception.
有什么建议?
Jon*_*eet 32
如果您提供自己的比较,则需要Distinct
在.NET代码中执行调用.为确保发生这种情况,请使用AsEnumerable
以转换IQueryable<T>
为IEnumerable<T>
:
var result = myEntity.MyDomainEntity
.Where(myDomainEntity => myDomainEntity.MySpecialID > default(int))
.AsEnumerable()
.Distinct(new FooComparer());
Run Code Online (Sandbox Code Playgroud)
当然,此时您将从数据库中提取更多数据.另一种方法是将数据分组:
var result = from entity in myEntity.MyDomainEntity
where entity.MySpecialID > 0
group entity by entity.MySpecialID into groups
select groups.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
这将使你获得每个ID遇到的第一个实体(假设我的查询 - fu没有让我失望).这基本上就是Distinct所做的,但它完全在数据库中.
(请注意未来的读者:调用First()
比FirstOrDefault()
看起来更有意义,但显然不起作用.)
归档时间: |
|
查看次数: |
8000 次 |
最近记录: |