我试图返回由子对象属性Owner.Name过滤的IQueryable地带。与查询样式解决方案配合良好,但我想使用lambda。
简而言之,这些是我通过EntityFramework映射的类:
public class Land
{
public int Id { get; set; }
public virtual ICollection<Owner> Owners { get; set; }
}
public class Owner
{
public int Id { get; set; }
public string Name { get; set; }
public int LandId { get; set; }
public virtual Land Lands { get; set; }
}
运行正常的查询:
var list = from land in db.Lands
join owner in db.Owners on land.Id equals Owner.LandId
where owner.Name.Contains("Smit")
select land;
我正在尝试使用它:
var list = db.Lands.Where(lnd => lnd.Owners.Count() > 0 &&
lnd.Owners.Where(own => own.Name.Contains("Smit")).Count() > 0);
它仅适用于小型列表,但对于具有数千条记录的某些列表,它会超时。
答案 0 :(得分:2)
好吧,可能导致速度问题的一个问题是您的lambda版本和非lambda版本做的事情大不相同。您不是lambda正在执行联接,联接的一侧位于一个位置。
为什么不只写等效的lambda?
var list = db.Lands.Join(db.Owners.Where(x=> x.Name.Contains("Smit")), a=> a.Id, b => b.LandId, (a,b) => a).toList();
我的意思是,这比您的非lambda更直接
答案 1 :(得分:0)
我认为您可以使用这个:
import pycuda.driver as drv
import pycuda.autoinit
from pycuda.compiler import SourceModule
mod = SourceModule("""
#include <stdio.h>
__global__ void myfirst_kernel()
{
printf("Hello,PyCUDA!!!");
}
""")
function = mod.get_function("myfirst_kernel")
function(block=(4,4,1))
# Flush context printf buffer
cuda.Context.synchronize()
答案 2 :(得分:0)
尝试一些更简单的方法:
var lands = db.Owners.Where(o => o.Name.Contains("Smit")).Select(o => o.Lands);
您只需要确保Owner.Name不为null,其余的将由LINQ完成。