gpt4 book ai didi

c# - 如何在 LINQ 语句中使用扩展方法?

转载 作者:行者123 更新时间:2023-12-02 15:33:10 25 4
gpt4 key购买 nike

我有一个扩展方法可以将 Address 转换为单行字符串:

public static class AddressExtensions
{
public static string ToOneLine(this Address address)
{
var sb = new StringBuilder();
sb.Append(address.Street);
if (!string.IsNullOrWhiteSpace(address.City)) sb.Append(string.Format("{0}, ",address.City));
if (!string.IsNullOrWhiteSpace(address.State)) sb.Append(string.Format("{0}, ", address.State));
if (!string.IsNullOrWhiteSpace(address.Zip)) sb.Append(string.Format("{0}, ", address.Zip));
return sb.ToString();
}
}

然后我使用它将数据从域模型传输到我的 DTO。下面的代码使用 foreach 并且工作正常:

var entity=_repository.GetAll();
var model = new List<SummaryViewModel>();
foreach (var e in entity)
{
model.Add(new SummaryViewModel
{
Address = e.Address.ToOneLine(),
Name = e.Name,
Id = e.Id
});
}

但是当使用LINQ时,

        var model = entity.Select(e => new SummaryViewModel
{
Address = e.Address.ToOneLine(), Id = e.Id
}).ToList();

我遇到了System.NotSupportedException

LINQ to Entities does not recognize the method 'System.String ToOneLine
(Domain.Models.Address)' method, and this method cannot be translated
into a store expression.

发生了什么?我认为这两种方法都应该有效。

在 LINQ 语句中使用扩展方法的正确方法是什么?

最佳答案

因为 EF 无法将该扩展方法转换为 SQL。解决这个问题的最简单方法是使用 AsEnumerable() 转向 Linq-to-Objects(这实际上就是 foreach 所做的):

var model = entity.AsEnumerable()
.Select(e => new SummaryViewModel
{
Address = e.Address.ToOneLine(), Id = e.Id
}).ToList();

ToList 不同,使用 AsEnumerable 不会在内存中创建额外的集合,它只是将 Linq 调用绑定(bind)到 Enumerable 而不是 可查询,因此映射是在内存中而不是在 SQL 中完成的。

关于c# - 如何在 LINQ 语句中使用扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24557287/

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