使用Linq Lambda按字符串子对象属性过滤实体对象列表

时间:2019-05-15 11:51:03

标签: c# entity-framework linq lambda

我试图返回由子对象属性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);

它仅适用于小型列表,但对于具有数千条记录的某些列表,它会超时。

3 个答案:

答案 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完成。