在连接的基本LINQ查询上使用lambda表达式

时间:2016-10-20 13:31:12

标签: c# mysql linq lambda

在进行基本的LINQ查询时,您可以稍后使用lambda表达式添加如下的where子句:query.Where(c => (init.Contains(c.user)));

我的问题是我需要在基本LINQ查询中使用join的查询中添加两个where子句。

我试图用添加的lambda表达式替换旧的基本LINQ查询,以防止重复代码。

这是我的代码;

var query = from c in db.Clgcom
            join u in db.Dvusr
            on c.Comaut equals u.Gitusr
            // && (initialen.Contains(c.Tstusr) // <-- query.Where(c => (initialen.Contains(c.Tstusr)));
            // This is what im trying to replace// ^^ This works because its in the same table
            // || initialen.Contains(u.Clgusr)) // <-- What do i type when i want to include both these conditions?
            && (c.Modid.StartsWith("C")
            || c.Modid.StartsWith("M"))
            select c;

if(filter != null){
    query = query.Where(c => (initialen.Contains(c.Tstusr) 
                             || initialen.Contains(u.Clgusr)));
                             // This doesn't work
}

有没有办法使用lambda表达式来实现在where子句中添加这两个条件?

或者我应该使用lambda表达式替换所有基本LINQ查询吗?

1 个答案:

答案 0 :(得分:1)

基本上,您还需要同时选择selectc来推迟u,然后选择c

var temp = from c in db.Clgcom
           join u in db.Dvusr on c.Comaut equals u.Gitusr
           where c.Modid.StartsWith("C") || c.Modid.StartsWith("M")
           select new {c, u};

if(filter != null){
    temp = temp.Where(x => initialen.Contains(x.c.Tstusr) 
                           || initialen.Contains(x.u.Clgusr));

var query = temp.Select(x => x.c);

如果ClgcomDvusr之间的关系是多对一,那么您可以执行以下操作,因为Clgcom应该具有基于外键关系的Dvusr导航属性

var query = from c in db.Clgcom
            where (c.Modid.StartsWith("C") || c.Modid.StartsWith("M")) && c.Dvuser != null
            select c;

if(filter != null){
    query = query.Where(c => initialen.Contains(c.Tstusr) 
                             || initialen.Contains(c.Dvusr.Clgusr));