解决 将LINQ查询从SQL翻译为LAMBDA语法

拉里

新成员
加入
3月27日,2021年
消息
3
编程经验
Beginner
你好,

在阅读101 LINQ样本时,我遇到了以下示例:

C#:
List<Customer> customers = GetCustomerList();

var orders = from c in customers
             from o in c.Orders
             where o.OrderDate >= new DateTime(1998, 1, 1)
             select (c.CustomerID, o.OrderID, o.OrderDate);

我希望使用lambda语法找到等效的代码。
似乎使用的方法是Selectmy,是这种情况吗?

谢谢,
拉里
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,161
地点
挪威
编程经验
10+
是的,可以使用方法语法写类似:
C#:
var orders = customers.SelectMany(c => c.Orders.Where(o => o.OrderDate >= new DateTime(1998, 1, 1)),
                             (c, o) => new { c.CustomerID, o.OrderID, o.OrderDate });
或者
C#:
var orders = customers.SelectMany(c => c.Orders,
                             (c, o) => new { c.CustomerID, o.OrderID, o.OrderDate })
                      .Where(a => a.OrderDate >= new DateTime(1998, 1, 1));
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,161
地点
挪威
编程经验
10+
没有太多解释,但代码并不复杂,它使用了 Selectmy. 过载,采用ColleationSelector和WequestEllector参数。
Imagine a Selectmy.(c => c.Orders) that would just return all orders from all customers flattened, the additional resultSelector lets you transform that while keeping source element (the customer) in scope, that's what (c, o) means.
这是一篇关于更多的文章: Linq Selectmany深度 - 杀死所有缺陷
 

拉里

新成员
加入
3月27日,2021年
消息
3
编程经验
Beginner
没有太多解释,但代码并不复杂,它使用了 Selectmy. 过载,采用ColleationSelector和WequestEllector参数。
Imagine a Selectmy.(c => c.Orders) that would just return all orders from all customers flattened, the additional resultSelector lets you transform that while keeping source element (the customer) in scope, that's what (c, o) means.
这是一篇关于更多的文章: Linq Selectmany深度 - 杀死所有缺陷
确实是的!

我面临的困难是理解MSDN。

给你一个例子:
C#:
Selectmy.<TSource,TCollection,TResult>(IEnumerable<TSource>, Func<TSource,IEnumerable<TCollection>>, Func<TSource,TCollection,TResult>)
  • 我像那样读:
    Selectmy.是一种占用3个参数的通用方法:
    ......... IENUMERAKES类型的第一类<TSource>(即包含TSOURCE类型的元素的令人令人享受的序列)
    ......第二个是委托/一种方法,它采用Tsource类型的参数,并返回包含Tcollection类型元素的枚举序列
    .........第三个是委托/采用两个参数的方法(类型Tsource类型之一,另一个Tcollection)并返回类型Tresult的对象


    我对吗?

  • 我没有得到的是关于第一个参数:我们在我们的客户和订单的示例中没有这个第一个参数,对吗?实际上,根据MSDN,我们只有2个参数而不是3个参数。

非常感谢
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,903
地点
切萨皮克,va.
编程经验
10+
Those methods listed there are extensions methods. The first parameter is a this parameter. In high-level terms, that basically says that the thing to the left of the dot is the first parameter.
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
扩展到什么 @skydiver 说,你可以编写一种定期的方法:
C#:
public static class ThingExtensions
{
    public static void DoSomething(Thing source, string text, int number)
    {
        // ...
    }   
}
然后这样做:
C#:
var aThing = new Thing();

DoSomething(aThing, "Hello World", 100);
或者您可以编写这样的扩展方法:
C#:
public static class ThingExtensions
{
    public static void DoSomething(this Thing source, string text, int number)
    {
        // ...
    }   
}
你仍然可以这样做,但你也可以这样做:
C#:
var aThing = new Thing();

aThing.DoSomething("Hello World", 100);
Extension methods allow you to call a method as though it was an instance member of the type of the first parameter. They were introduced as part of LINQ, with methods like Select, Where and First being extension methods with a first parameter of type IEnumerable<T>. Those methods can thus be called on enumerable lists in a very natural way. Because calling instance methods feels more natural and self-documenting, extension methods have found use far beyond LINQ in many developers' code. Note that an extension method must be declared static in a static class and have the first parameter declared this. It is customary to name the class after the type you're extending and group methods that extend a specific type.
 
最佳 底部