伙计们,我也很难将这种低于LINQ表达式(左连接实现)lambda表达式(学习)。
var result = from g in grocery
join f in fruit on g.fruitId equals f.fruitId into tempFruit
join v in veggie on g.vegid equals v.vegid into tempVegg
from joinedFruit in tempFruit.DefaultIfEmpty()
from joinedVegg in tempVegg.DefaultIfEmpty()
select new { g.fruitId, g.vegid, fname = ((joinedFruit == null) ? string.Empty : joinedFruit.fname), vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname) };
有人建议我如何做到这一点。
我真的很感激,如果有人给我“C#lambda表达式和Linqs”的优秀教程链接
你可以看看101个LINQ样品和C#3.0的查询表达式翻译小抄
下面是我遵循启发:
青睐LINQ表达了lambda表达式时,你有加入。
我认为,随着lambda表达式联接显得凌乱而难以阅读。
我通常使用的ReSharper帮我转换的事情方法链,拉姆达的,这有助于我去来回还算方便。
var result = from g in grocery
join f in fruit on g.fruitId equals f.fruitId into tempFruit
join v in veggie on g.vegid equals v.vegid into tempVegg
from joinedFruit in tempFruit.DefaultIfEmpty()
from joinedVegg in tempVegg.DefaultIfEmpty()
select new { g.fruitId, g.vegid, fname = ((joinedFruit == null) ? string.Empty : joinedFruit.fname), vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname) };
然后使用LINQ转换到方法链的ReSharper的选项等于以下:
var result =grocery .GroupJoin(fruit, g => g.fruitId, f => f.fruitId, (g, tempFruit) => new {g, tempFruit})
.GroupJoin(veggie, @t => @t.g.vegid, v => v.vegid, (@t, tempVegg) => new {@t, tempVegg})
.SelectMany(@t => @t.@t.tempFruit.DefaultIfEmpty(), (@t, joinedFruit) => new {@t, joinedFruit})
.SelectMany(@t => @t.@t.tempVegg.DefaultIfEmpty(),(@t, joinedVegg) =>
new
{
@t.@t.@t.g.fruitId,
@t.@t.@t.g.vegid,
fname = ((@t.joinedFruit == null) ? string.Empty : @t.joinedFruit.fname),
vname = ((joinedVegg == null) ? string.Empty : joinedVegg.vname)
});
诚然输出小于可取的,但它在理解语法开始的地方至少有帮助。
这里是你会如何写在lambda这个查询:
var customers = new List {
new Customer { CompanyId = “AC”, CustomerId = “Customer1” },
new Customer { CompanyId = “not-AC”, CustomerId = “Customer2” },
};
var userCustomers = new List {
new UserCustomer { CompanyId = “AC”, CustomerId = “Customer1”, User = “not-admin” },
new UserCustomer { CompanyId = “AC”, CustomerId = “Customer1”, User = “admin” },
new UserCustomer { CompanyId = “AC”, CustomerId = “Customer2”, User = “not-admin” },
new UserCustomer { CompanyId = “AC”, CustomerId = “Customer2”, User = “admin” },
new UserCustomer { CompanyId = “not-AC”, CustomerId = “Customer1”, User = “not-admin” },
new UserCustomer { CompanyId = “not-AC”, CustomerId = “Customer1”, User = “admin” },
new UserCustomer { CompanyId = “not-AC”, CustomerId = “Customer2”, User = “not-admin” },
new UserCustomer { CompanyId = “not-AC”, CustomerId = “Customer2”, User = “admin” }
};
使用查询表达式
var query =
from c in customers
join uc in userCustomers on
new { c.CompanyId, c.CustomerId } equals new { uc.CompanyId, uc.CustomerId }
where c.CompanyId == “AC” && uc.User == “admin“
select c;
使用lambda表达式
var lambda = customers.Where(c => c.CompanyId == “AC”) // inner sequence
.Join(userCustomers.Where(uc => uc.User == “admin”), // outer sequence
c => new { c.CompanyId, c.CustomerId }, // inner key selector
uc => new { uc.CompanyId, uc.CustomerId }, // outer key selector
(c, uc) => c);
这两种方法产生相同的结果(客户与公司ID“AC”和客户ID“customer1表”),但你可以看到,lambda表达式是更难写和读!
希望这可以帮助!
下载LINQPad ; 它配备了学习LINQ内置样本。