gpt4 book ai didi

linq - 通过扩展方法在 linq to sql 查询中封装逻辑

转载 作者:行者123 更新时间:2023-12-04 20:57:27 25 4
gpt4 key购买 nike

在您的 LINQ to SQL .dbml 文件中给定两个具有以下属性的类。

Customer
CustomerId
FirstName
LastName
AddressId

Address
AddressId
Street
City
State
Zip

您可以构造如下所示的 LINQ 查询。
using(var db = new MyDataContext())
{
results = db.Customers
.Where(c => c.LastName.BeginsWith("o"))
.Select(c => new
{
c.CustomerId,
MailingAddress = c.FirstName + " "
+ c.LastName
+ Environment.NewLine
+ c.Address.Street
+ Environment.NewLine
+ c.Address.City + ", "
+ c.Address.State + " "
+ c.Address.Zip
}).ToList();

}

现在假设您想说明将邮寄地址放在一起的逻辑。您可以通过两种方法来实现这一点,即向 Customer 类添加一个新属性,或者创建一个扩展方法。
public static class CustomerExtensions
{
public static string GetMailingAddress(this Customer cust)
{
return cust.FirstName + " "
+ cust.LastName
+ Environment.NewLine
+ cust.Address.Street
+ Environment.NewLine
+ cust.Address.City + ", "
+ cust.Address.State + " "
+ cust.Address.Zip;
}
}

public partial class Customer
{
public string MailingAddress
{
get
{
return this.FirstName + " "
+ this.LastName
+ Environment.NewLine
+ this.Address.Street
+ Environment.NewLine
+ this.Address.City + ", "
+ this.Address.State + " "
+ this.Address.Zip;
}
}
}

你现在可以使用其中之一,你会得到正确的结果
using(var db = new MyDataContext())
{
results = db.Customers
.Where(c => c.LastName.BeginsWith("o"))
.Select(c => new
{
c.CustomerId,
c.MailingAddress, //new property
Address2 = c.GetMailingAddress() // new extension method
}).ToList();

}

这两种方式的问题在于,这样做会导致您检索的每一行都需要额外的往返数据库。初始查询将从 Customer 表中提取信息,然后在评估邮寄地址时需要单独对每个地址记录进行评分。

有没有办法封装这个逻辑并将其与客户类联系起来,这样您就不需要任何额外的数据库往返行程?

我认为必须有某种方法来创建一个扩展方法,而不是返回一个表达式而不是一个字符串。我对吗?如果是这样,我该怎么做?

最佳答案

我知道这不是您正在寻找的,但您可以这样做:

var options = new DataLoadOptions();
options.LoadWith<Customer>(c => c.Address);
db.LoadOptions = options;

然后它只会进行一次旅行,因为地址是与客户一起检索的。

关于linq - 通过扩展方法在 linq to sql 查询中封装逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3935237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com